莫名re
查看原帖
莫名re
855226
zxcdxw楼主2025/6/14 21:33

数据给的是不是有问题,把N开到5e5就过了,但是1e5就不行。

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define int long long
const int N = 5e5 + 9;
const ll mod=998244353 ;
const ll pp=13131;
vector<int>tree,a,tag;
void buildtree(int i,int s,int t){
	if(s==t){
		tree[i]=a[s];
		return ;
	}
	int mid=s+t>>1;
	buildtree(i<<1,s,mid);
	buildtree(i<<1|1,mid+1,t);
	tree[i]=tree[i<<1]+tree[i<<1|1];
}
void pushdown(int i,int s,int t){
	if(tag[i]){
		int mid=s+t>>1;
		tag[i<<1]+=tag[i];
		tag[i<<1|1]+=tag[i];
		tree[i<<1]+=(mid-s+1)*tag[i];
		tree[i<<1|1]+=(t-mid)*tag[i];
		tag[i]=0;
	}
}
void update(int i,int s,int t,int l,int r,int k){
	if(s>=l&&t<=r){
		tree[i]+=(t-s+1)*k;
		tag[i]+=k;
		return ;
	}
	int mid=s+t>>1;
	pushdown(i,s,t); 
	if(mid>=l) update(i<<1,s,mid,l,r,k);
	if(mid<r) update(i<<1|1,mid+1,t,l,r,k);
	tree[i]=tree[i<<1]+tree[i<<1|1];
}
ll query(int i,int s,int t,int l,int r){
	if(s>=l&&t<=r){
		pushdown(i,s,t);
		return tree[i];
	}
	int mid=s+t>>1;
	ll sum=0;
	pushdown(i,s,t);
	if(mid>=l) sum+=query(i<<1,s,mid,l,r);
	if(mid<r) sum+=query(i<<1|1,mid+1,t,l,r);
	return sum;
}
void solve() {
	int n,m;
	cin>>n>>m;
	tree.resize(4*N+9);
	tag.resize(4*N+9);
	a.resize(n+1);
	for(int i=1;i<=n;++i) cin>>a[i];
	buildtree(1,1,n);
	while(m--){
		int op;
		cin>>op;
		if(op==1){
			int x,y,k;
			cin>>x>>y>>k;
			update(1,1,n,x,y,k);
		}
		else{
			int x,y;
			cin>>x>>y;
			cout<<query(1,1,n,x,y)<<'\n';
		}
	}
}
signed main() {
	cin.tie(0)->sync_with_stdio(false);
	int t = 1;
	//	cin>>t;
	while (t--) solve();
}
2025/6/14 21:33
加载中...