社区讨论

线段数求调0pts

P3372【模板】线段树 1参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lrbqp23v
此快照首次捕获于
2024/01/13 15:22
2 年前
此快照最后确认于
2024/01/13 18:18
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long  
//线段树模板——区间和
using namespace std;

int a[400010];

struct treenode {
	int value;
	int lazytag;
	int l,r;
} treenode[500010];

void pushdown(int k) {
	int mid=(treenode[k].l+treenode[k].r)>>1;
	treenode[k*2].lazytag=treenode[k].lazytag;
	treenode[k*2].value+=(mid-treenode[k].l+1)*treenode[k*2].lazytag;
	treenode[k*2+1].lazytag=treenode[k].lazytag;
	treenode[k*2+1].value+=(treenode[k].r-mid)*treenode[k*2+1].lazytag;
	treenode[k].lazytag=0;
}

void build(int k,int l,int r) { //递归建树
	treenode[k].l=l;
	treenode[k].r=r;
	if(l==r) {
		treenode[k].value=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	treenode[k].value=treenode[k*2].value+treenode[k*2+1].value;
	//更新
}

void update(int k,int l,int r,int v) {
	if(treenode[k].l==l&&treenode[k].r==r) {
		pushdown(k);
		treenode[k].value+=v*(treenode[k].r-treenode[k].l+1);
		treenode[k].lazytag=v;
		return;
	}
	int mid=(treenode[k].l+treenode[k].r)>>1;
	if(r<=mid) {
		update(k*2,l,r,v);
	} else if(l>mid) {
		update(k*2+1,l,r,v);
	} else {
		update(k*2,l,mid,v);
		update(k*2+1,mid+1,r,v);
	}
	treenode[k].value=treenode[k*2].value+treenode[k*2+1].value;
}
/*
int query(int k,int l,int r) { //傻逼区间覆盖去死吧!
	if(l<=treenode[k].l&&r>=treenode[k].r) {

		return treenode[k].maxn;
	}
	int mid=(treenode[k].l+treenode[k].r)>>1;
	int maxn=-inf;
	if(l<=mid) {
		maxn=max(maxn,query(k*2,l,r));
	}
	if(r>mid) {
		maxn=max(maxn,query(k*2+1,l,r));
	}
	return maxn;
}
*/
int query(int k,int l,int r) {
	if(l==treenode[k].l&&r==treenode[k].r) {
		return treenode[k].value;
	}
	int mid=(treenode[k].l+treenode[k].r)>>1;
	if(r<=mid) {
		pushdown(k);
		return query(k*2,l,r);
	} else if(l>mid) {
		pushdown(k);
		return query(k*2+1,l,r);
	} else {
		pushdown(k);
		return query(k*2,l,mid)+query(k*2+1,mid+1,r);
	}
}

signed main() {
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(m--){
		int a,b,c,d;
		cin>>a>>b>>c;
		if(a==1){
			cin>>d;	
			update(1,b,c,d);
		}
		else{
			cout<<query(1,b,c)<<endl;
		}
	} 
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...