社区讨论
线段树 0pts 求调
P2357守墓人参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mloxcmeg
- 此快照首次捕获于
- 2026/02/16 16:40 3 天前
- 此快照最后确认于
- 2026/02/16 23:57 3 天前
r.t.
玄一棺
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+1;
int n,m;
struct Tree{
int sum,tag,l,r;
}tree[N*4];
int a[N];
void push_up(int k){
tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
}
void push_down(int k,int l,int r){
if(tree[k].tag){
int mid=(l+r)>>1;
tree[k<<1].tag+=tree[k].tag;
tree[k<<1|1].tag+=tree[k].tag;
tree[k<<1].sum+=tree[k].tag*(mid-l+1);
tree[k<<1|1].sum+=tree[k].tag*(r-mid);
tree[k].tag=0;
}
}
void change(int k,int l,int r,int x){
if(l<=tree[k].l&&tree[k].r<=r){
tree[k].sum+=(tree[k].r-tree[k].l+1)*x;
tree[k].tag+=x;
return;
}
push_down(k,tree[k].l,tree[k].r);
int mid=(tree[k].l+tree[k].r)>>1;
if(l<=mid) change(k<<1,l,r,x);
if(r>mid) change(k<<1|1,l,r,x);
push_up(k);
}
int query(int k,int l,int r){
if(l<=tree[k].l&&tree[k].r<=r) return tree[k].sum;
push_down(k,l,r);
int ans=0;
int mid=(tree[k].l+tree[k].r)>>1;
if(l<=mid) ans+=query(k<<1,l,r);
if(r>mid) ans+=query(k<<1|1,l,r);
return ans;
}
void build(int k,int l,int r){
tree[k].l=l;
tree[k].r=r;
if(l==r){
tree[k].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
push_up(k);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
int op;
cin>>op;
if(op==1){
int l,r,k;
cin>>l>>r>>k;
change(1,l,r,k);
}else if(op==2){
int k;
cin>>k;
change(1,1,1,k);
}else if(op==3){
int k;
cin>>k;
change(1,1,1,-k);
}else if(op==4){
int l,r;
cin>>l>>r;
cout<<query(1,l,r)<<endl;
}else{
cout<<query(1,1,1)<<endl;
}
}
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...