蒟蒻悬棺求调 后三个点WA
查看原帖
蒟蒻悬棺求调 后三个点WA
237650
Crouy_Li_Dorac楼主2024/8/2 13:11

rt

线段树写法后三个大数据WA了,不解QAQ

#include<bits/stdc++.h>
#define ll long long
const int N=1e5+20;
using namespace std;
ll n,m;
ll a[N];
ll tree[4*N];
ll tag[4*N];
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
void push_up(ll p){
	tree[p]=tree[ls(p)]+tree[rs(p)];
}
void build(ll p,ll pl,ll pr){
	tag[p]=0;
	if(pl==pr){tree[p]=a[pl];return;}
	ll mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
}
void addtag(ll p,ll pl,ll pr,ll d){
	tag[p]+=d;
	tree[p]+=d*(pr-pl+1);
}
void push_down(ll p,ll pl, ll pr){
	if(tag[p]){
		ll mid=(pl+pr)>>1;
		addtag(ls(p),pl,mid,tag[p]);
		addtag(rs(p),mid+1,pr,tag[p]);
		tag[p]=0;
	}
}
void update(ll l,ll r,ll p,ll pl,ll pr,ll d){
	if(l<=pl&&r>=pr){
		addtag(p,pl,pr,d);
		return;
	}
	push_down(p,pl,pr);
	ll mid=(pl+pr)>>1;
	if(l<=mid)	update(l,r,ls(p),pl,mid,d);
	if(r>mid)	update(l,r,rs(p),mid+1,pr,d);
	push_up(p);
}
ll query(ll l,ll r,ll p,ll pl,ll pr){
	if(pl>=l&&r>=pr)	return tree[p];
	push_down(p,pl,pr);
	ll res=0;
	ll mid=(pr+pl)>>1;
	if(mid>=l)	res+=query(l,r,ls(p),pl,mid);
	if(r>mid)	res+=query(l,r,rs(p),mid+1,pr);
	return res;
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++)	scanf("%lld",&a[i]);
	build(1,1,n);
	while(m--){
		ll q,l,r,d;
		scanf("%lld",&q);
		if(q==1){
			scanf("%lld%lld%lld",&l,&r,&d);
			update(l,r,1,1,n,d);
		}
		if(q==2){
			scanf("%lld%lld",&l,&r);
			printf("%d\n",query(l,r,1,1,n));
		}
	}
	return 0;
}

玄关求dalao赐教

2024/8/2 13:11
加载中...