60分 估计是数据范围的问题
查看原帖
60分 估计是数据范围的问题
803885
_8008008楼主2023/9/7 18:07

好像没有人是我这种情况(评测记录)

#include<iostream>
#define int long long
using namespace std;
const int N =10000;
struct node{
	int l,r,sum,lazy;
};
int a[N],n,q;node tree[5*N]; 
inline int build(int num,int l,int r){
	tree[num].l=l;tree[num].r=r;
	if(l==r){
		tree[num].sum=a[l];
		return tree[num].sum;
	}
	int mid=(l+r)/2;
	tree[num].sum=build(num*2,l,mid)+build(num*2+1,mid+1,r);
	return tree[num].sum;
}
int ans_l,ans_r;
inline void add(int num,int k){
	int l=tree[num].l,r=tree[num].r,mid=(l+r)/2;
	if(ans_r<l||r<ans_l)return;
	if(ans_l<=l&&ans_r>=r){
		tree[num].lazy+=k;
		return;
	}
	if(ans_l<=mid)add(num*2,k);
	if(ans_r>=mid+1)add(num*2+1,k);
	if(ans_l>=l&&ans_r<r)tree[num].sum+=(ans_r-ans_l+1)*k;
	if(ans_l<=l&&ans_r<r)tree[num].sum+=(ans_r-l+1)*k;
	if(ans_r>=r&&l<ans_l)tree[num].sum+=(r-ans_l+1)*k;
}
inline int sum(int num){
	int l=tree[num].l,r=tree[num].r,mid=(l+r)/2,ans=0;
	if(ans_l<=l&&ans_r>=r){
		return tree[num].sum+(r-l+1)*(tree[num].lazy);
	}
	if(tree[num].lazy!=0){
		tree[num*2].lazy+=tree[num].lazy;
		tree[num*2+1].lazy+=tree[num].lazy;
		tree[num].sum+=(r-l+1)*(tree[num].lazy);
		tree[num].lazy=0;
	}
	if(ans_l<=mid)ans+=sum(num*2);
	if(ans_r>=mid+1)ans+=sum(num*2+1);
	return ans;
}
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(q--){
		int moss;cin>>moss;
		cin>>ans_l>>ans_r;
		if(moss==1){
			int k;cin>>k;
			add(1,k);
		}else{
			cout<<sum(1)<<endl;
		}
	}
	return 0;
}
2023/9/7 18:07
加载中...