社区讨论

❤性感❤线段树求❤调❤(样例寄了)

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@m2lpbd8p
此快照首次捕获于
2024/10/23 17:58
去年
此快照最后确认于
2024/10/23 18:00
去年
查看原帖
rt
CPP
#include <bits/stdc++.h>

using namespace std;

using ll=long long;

struct tree{
	#define ls (p<<1)
	#define rs (p<<1|1)
	ll l,r;
	ll val,tg;
}t[800005];

ll a[200005],n,q,w;
char ch;

void build(ll l,ll r,ll p){
	t[p]={l,r,0,0};
	if(l==r){
		t[p].val=a[l];
		return;
	}
	ll mid=l+r>>1;
	build(l,mid,ls);
	build(mid+1,r,rs);
	t[p].val=t[ls].val+t[rs].val;
	return ;
}

inline void spread(int p){
	t[ls].tg+=t[p].tg;
	t[rs].tg+=t[p].tg;
	t[ls].val+=((t[ls].r-t[ls].l+1)*t[p].tg);
	t[rs].val+=((t[rs].r-t[rs].l+1)*t[p].tg);
	t[p].tg=0;
	return ;
}

inline void update(ll p,ll sx,ll sy,ll k){
	if(sx<=t[p].l&&sy>=t[p].r){
		t[p].val+=((t[p].r-t[p].l+1)*k);
		t[p].tg+=k;
		return ;
	}
	spread(p);
	ll mid=t[p].l+t[p].r>>1;
	if(sx<=mid) update(ls,sx,sy,k);
	if(sy>mid) update(rs,sx,sy,k);
	t[p].val=t[ls].val+t[rs].val;
	return;
}

ll ans;

inline ll query(int sx,int sy,int p){
	if(sx<=t[p].l&&t[p].r<=sy) return t[p].val;
	ans=0;
	spread(p);
	ll mid=t[p].l+t[p].r>>1;
	if(sx<=mid) ans+=query(sx,sy,ls);
	if(sy>mid) ans+=query(sx,sy,rs);
	t[p].val=t[ls].val+t[rs].val;
	return ans;
} 

inline void read(ll &n){
	n=0;
	ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while('0'<=ch&&ch<='9'){
		n=(n<<3)+(n<<1)+(ch^48);
		ch=getchar();
	}
	return ;
}

ll l,r,d;

int main(){
//	freopen("wxyt1.in","r",stdin);
//	freopen("wxyt.out","w",stdout);
	read(n),read(q);
	for(ll i =1 ;i<=n; i++)read(a[i]);
	build(1,n,1);
	while(q--){
	    ll opt;
	    read(opt);
		if(opt==1) {
			read(l),read(r),read(d);
			update(1,l,r,d);
			}
		else{
			read(l),read(r);
		    cout<<query(l,r,1)<<'\n';
		}
	}
//	freopen("CON","w",stdout);
//	system("fc wxyt.out wxyt1.ans");
	return 0;
}

回复

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

正在加载回复...