蒟蒻求助
查看原帖
蒟蒻求助
930914
Pumpkin_vs_Earth楼主2024/1/28 09:08

分块写炸了,只对了前七个点,求助!

传送门

#include<bits/stdc++.h>
#define maxn 100005
#define B 305
using namespace std;
int n,m,a[maxn];
int sum[B],lazy[B];
void add(int l,int r,int v){
	int L=(l-1)/B+1,R=(r-1)/B+1;
	for(int i=L+1;i<=R-1;i++){
		lazy[i]+=v,sum[i]+=v*B;
	}
	for(int i=l;i<=min(r,L*B);i++)
		a[i]+=v,sum[L]+=v;
	if(L!=R){
		for(int i=(R-1)*B+1;i<=r;i++)
			a[i]+=v,sum[R]+=v;
	}
}
void ask(int l,int r){
	int L=(l-1)/B+1,R=(r-1)/B+1,ans=0;
	for(int i=L+1;i<=R-1;i++){
		ans+=sum[i];
	}
	for(int i=l;i<=min(r,L*B);i++)
		ans+=a[i]+lazy[L];
	if(L!=R){
		for(int i=(R-1)*B+1;i<=r;i++)
			ans+=a[i]+lazy[R];
	}
	cout<<ans<<endl;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;;i++){
		for(int j=(i-1)*B+1;j<=i*B;j++){
			sum[i]+=a[j];
		}
		if(i*B>=n)break;
	} 
	for(int i=1;i<=m;i++){
		int opt,l,r,v;
		cin>>opt>>l>>r;
		if(opt==1)cin>>v,add(l,r,v);
		else ask(l,r);
	}
	return 0;
}
2024/1/28 09:08
加载中...