样例全过,爆零
  • 板块P2357 守墓人
  • 楼主telesport
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/4/3 15:44
  • 上次更新2023/11/5 01:06:38
查看原帖
样例全过,爆零
457208
telesport楼主2021/4/3 15:44
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll a[800005],sum[800005],add[800005],zhu=0,fzhu=0;
void build(ll k,ll l,ll r){
	if(l==r){
		sum[k]=a[l];
		return;
	}
	ll mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	sum[k]=sum[k*2]+sum[k*2+1];
}
void addsom(ll k,ll l,ll r,ll x,ll y,ll v){
	if(x<=l&&y>=r){
		add[k]+=v;
		return;
	}
	sum[k]+=(min(r,y)-max(l,x)+1)*v;
	ll mid=(l+r)/2;
	if(x<=mid) addsom(k*2,l,mid,x,y,v);
	if(mid<y) addsom(k*2+1,mid+1,r,x,y,v);
}
ll check(ll k,ll l,ll r,ll x,ll y){
	if(l>=x&&r<=y) return sum[k]+(r-l+1)*add[k];
	ll mid=(l+r)/2;
	ll ans=sum[k]+(min(r,y)-max(l,x)+1)*add[k];
	if(x<=mid) ans+=check(2*k,l,mid,x,y);
	if(mid<y) ans+=check(2*k+1,mid+1,r,x,y);
	return ans;
}
int main(){
	ll i,j,m,n,k,x,y,v;
	scanf("%lld%lld",&n,&m);
	for(i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	} 
	build(1,1,n);
	while(m--){
		cin>>k;
		if(k==1){
			scanf("%lld%lld%lld",&x,&y,&v);
			if(x<=1) fzhu+=v;
			addsom(1,1,n,x,y,v);
		}
		if(k==2){
			scanf("%lld",&v);
			zhu+=v;
		}
		if(k==3){
			scanf("%lld",&v);
			zhu-=v;
		}
		if(k==4){
			scanf("%lld%lld",&x,&y);
			if(x<=1) printf("%lld\n",zhu+check(1,1,n,x,y));
			else printf("%lld\n",check(1,1,n,x,y));
		}
		if(k==5){
			printf("%lld\n",fzhu+zhu+a[1]);
		}
	}
	return 0;
}
2021/4/3 15:44
加载中...