10pts求条
查看原帖
10pts求条
1352501
jms23012楼主2024/12/20 23:45
#include <bits/stdc++.h>
using namespace std;
long long n,a[100005],m;long long cmp,x,y,v;
struct point{
	long long l,r,tt,lazy;
}shu[500005];
inline void pushup(int num){
	
	shu[num].tt=shu[num<<1].tt+shu[num<<1|1].tt;
}
void zao(long long num,long long x,int y){
	shu[num].l=x;shu[num].r=y;
	if(x==y){
		
		
		shu[num].tt=a[x];
		return ;
	}
	long long mid=x+y>>1;
	zao(num<<1,x,mid);zao(num<<1|1,mid+1,y);
	pushup(num);
}
void add(long long sum){
	if(shu[sum].l>=x&&shu[sum].r<=y){
		shu[sum].lazy+=v;
		shu[sum].tt+=shu[sum].lazy*(shu[sum].r-shu[sum].l+1);
		return ;
	}
	shu[sum<<1].lazy+=shu[sum].lazy;
	shu[sum<<1|1].lazy+=shu[sum].lazy;
	shu[sum].lazy=0;
	long long mid=shu[sum].l+shu[sum].r>>1;
	if(x<=mid) add(sum<<1);
	if(y>mid) add(sum<<1|1);
	pushup(sum);
}
long long search(long long sum){
	long long res=0;
	if(shu[sum].l>=x&&shu[sum].r<=y) return shu[sum].tt;
	long long mid=shu[sum].l+shu[sum].r>>1;
	if(shu[sum].lazy!=0){
		shu[sum<<1].tt+=shu[sum].lazy*(shu[sum<<1].r-shu[sum<<1].l+1);
		shu[sum<<1|1].tt+=shu[sum].lazy*(shu[sum<<1|1].r-shu[sum<<1|1].l+1);
		shu[sum<<1].lazy+=shu[sum].lazy;
		shu[sum<<1|1].lazy+=shu[sum].lazy;
		shu[sum].lazy=0;
	}
	if(x<=mid) res+=search(sum<<1);
	if(y>mid) res+=search(sum<<1|1);
	return res;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	zao(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>cmp;
		if(cmp==1){
			cin>>x>>y>>v;
			shu[1].lazy+=v;
			add(1);
		}
		else{
			cin>>x>>y;
			cout<<search(1)<<endl;
		}
	}
	return 0;
}

感觉代码内容与https://www.luogu.com.cn/discuss/1020130

完全相同,但10ptsWA

2024/12/20 23:45
加载中...