10分线段树求调,自己造了一组Hack
查看原帖
10分线段树求调,自己造了一组Hack
478461
_lfxxx_楼主2021/7/22 15:46

应该是 update 出锅了.。

#include<cstdio>
#define maxn 100005
#define ll long long
#define ls(k) k<<1
#define rs(k) k<<1|1
#define push_up(k) sum[k]=sum[ls(k)]+sum[rs(k)]
#define push_down(k,l,r,v) tag[k]+=v,sum[k]+=v*(r-l+1)
int L,R;
ll a[maxn],sum[maxn<<2],tag[maxn<<2],v;
void build(int k,int l,int r){
	if(l==r){
		sum[k]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(ls(k),l,mid),
	build(rs(k),mid+1,r);
	push_up(k);
}
void update(int k,int l,int r){
	if(L<=l&&r<=R){
		push_down(k,l,r,v);
		return;
	}
	int mid=l+r>>1;
	push_down(ls(k),l,mid,tag[k]);
	push_down(rs(k),mid+1,r,tag[k]);
	tag[k]=0;
	if(L<=mid)
		update(ls(k),l,mid);
	if(mid<R)
		update(rs(k),mid+1,r);
	push_up(k);
}
ll query(int k,int l,int r){
	if(L<=l&&r<=R)
		return sum[k];
	int mid=l+r>>1;
	ll ans=0;
	push_down(ls(k),l,mid,tag[k]);
	push_down(rs(k),mid+1,r,tag[k]);
	tag[k]=0;
	if(L<=mid)
		ans+=query(ls(k),l,mid);
	if(mid<R)
		ans+=query(rs(k),mid+1,r);
	return ans;
}
int main(){
	int n,m,op;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	while(m--){
		scanf("%d%d%d",&op,&L,&R);
		if(op==1)
			scanf("%lld",&v),update(1,1,n);
		else
			printf("%lld\n",query(1,1,n));
	}
	return 0;
}

in:

5 5
1 5 4 2 3
1 2 3 2
1 1 5 1
2 1 3
2 3 5
2 2 4

第一次修改完为 1 7 6 2 3

第二次修改完为 2 8 7 3 4

output:

17
14
18

myoutput:

17
18
22
2021/7/22 15:46
加载中...