P3372线段树求调
  • 板块灌水区
  • 楼主CJ_Fu
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/4/8 23:33
  • 上次更新2023/10/28 04:14:19
查看原帖
P3372线段树求调
539344
CJ_Fu楼主2022/4/8 23:33

rt,样例一直输出0,7,7

#include<iostream>
#define int long long
using namespace std;
const int MAXN=1e6+3;
struct T{
	int sum,tag;
}tree[MAXN<<2];
int a[MAXN];
void lazy(int now,int l,int r,int n){
	tree[now].tag+=n;
	tree[now].sum+=n*(r-l+1);
}
void pushup(int now){
	tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
}
void pushdown(int now,int l,int r){
	int mid=(l+r)>>1;
	lazy(now<<1,l,mid,tree[now].tag);
	lazy(now<<1|1,mid+1,r,tree[now].tag);
	tree[now].tag=0;
}
void build(int now,int l,int r){
	if(l==r){
		tree[now].sum=a[l];
	}else{
		int mid=(l+r)>>1;
		build(now<<1,l,mid);
		build(now<<1|1,mid+1,r);
		pushup(now);
	}
}
void modify(int now,int l,int r,int x,int y,int n){
	if(x<=l&&r<=y){
		tree[now].sum+=n*(r-l+1);
		tree[now].tag+=n;
		return;
	}
	pushdown(now,l,r);
	int mid=(l+r)>>1;
	if(x<=mid){
		modify(now<<1,l,mid,x,y,n);
	}
	if(mid+1<=y){
		modify(now<<1|1,mid+1,r,x,y,n);
	}
	pushup(now);
}
int query(int now,int l,int r,int x,int y){
	int ans=0;
	if(x<=l&&r<=y){
		return tree[now].sum;
	}
	int mid=(l+r)>>1;
	pushdown(now,l,r);
	if(x<=mid){
		ans+=query(now<<1,x,y,l,mid);
	}
	if(mid+1<=y){
		ans+=query(now<<1|1,x,y,mid+1,r);
	}
	return ans;
}
signed main(){
	int n,m;
	int x,y,k,type;
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	while(m--){
		scanf("%lld",&type);
		switch(type){
		case 1:
			scanf("%lld%lld%lld",&x,&y,&k);
			modify(1,1,n,x,y,k);
			break;
		case 2:
			scanf("%lld%lld",&x,&y);
			cout<<query(1,1,n,x,y)<<endl;
			break;
		}
	}
	return 0;
}
2022/4/8 23:33
加载中...