社区讨论

线段树 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 条回复,欢迎继续交流。

正在加载回复...