社区讨论

95分,求调,改对必关

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mjf66zcx
此快照首次捕获于
2025/12/21 11:31
2 个月前
此快照最后确认于
2025/12/23 19:15
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define N 200005
struct Node{    
	int l,r;
	long long sum;
	long long add;	
}tr[N*4];
int a[N];
int n,m;
void pushup(Node &u,Node &l,Node &r){
	u.sum=l.sum+r.sum;      
}
void pushup(int u){
	pushup(tr[u],tr[2*u],tr[2*u+1]);
}
void pushdown(int u){
	auto &root=tr[u],&left=tr[2*u],&right=tr[2*u+1];    
	if (root.add) {        
		left.add+=root.add;
		left.sum+=(long long)(left.r-left.l+1)*root.add;
		right.add+=root.add;
		right.sum+=(long long)(right.r-right.l+1)*root.add;
		root.add=0;    
	}
}
void build(int u,int l,int r){
	 if(l==r){
		tr[u].l=l,tr[u].r=r,tr[u].sum=a[l],tr[u].add=0; 
	 }
	 else {        
	 	tr[u].l=l,tr[u].r=r;        
	 	int mid=(l+r)/2;        
	  	build(2*u,l,mid);
	 	build(2*u+1,mid+1,r);        
	 	pushup(u);
	 	tr[u].add=0;
	 }
}
void modify(int u,int l,int r,long long d){
	if(tr[u].l>=l&&tr[u].r<=r){
		tr[u].sum+=(long long)(tr[u].r-tr[u].l+1)*d;        
		tr[u].add+=d;
	}    
	else{        
		pushdown(u);        
		int mid=tr[u].l+tr[u].r>>1;
		if (l<=mid) modify(2*u,l,r,d);        
		if (r>mid) modify(2*u+1,l,r,d);        
		pushup(u); 
	}
}
Node query(int u,int l,int r){
	if (tr[u].l >= l && tr[u].r <= r) return tr[u];    
	pushdown(u);
	int mid=tr[u].l+tr[u].r>>1;       
	if (r<=mid) return query(2*u,l,r);
	if (l>mid) return query(2*u+1,l,r);
    Node left=query(2*u,l,r);            
    Node right=query(2*u+1,l, r);            
    Node res;          
	res.l=left.l;
    res.r=right.r;  
    pushup(res,left,right);           
    return res;       
}
int main(){
    scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int p;
		int x,y;
		long long k;
		scanf("%d",&p);
		if(p==1){
			scanf("%d%d%lld",&x,&y,&k);
			modify(1,x,y,k);
		}
		else{
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(1,x,y).sum);
		}
	}
	return 0;
}
95分,只错了第19个测试点,求调,改对必关

回复

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

正在加载回复...