MnZn刚学分块,0pts求调
查看原帖
MnZn刚学分块,0pts求调
1248522
mlvx楼主2024/7/13 11:29

全WA/kk

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
int n,len,tot,q,a[N],L[N],R[N],belong[N];ll add[N],sum[N];
void update(int l,int r,int v){
	if(belong[l]==belong[r])for(int i=l;i<=r;i++)a[i]+=v,sum[belong[l]]+=v;
	else{
		for(int i=l;i<=R[belong[l]];i++)a[i]+=v,sum[belong[l]]+=v;
		for(int i=L[belong[r]];i<=r;i++)a[i]+=v,sum[belong[r]]+=v;
		for(int i=belong[l]+1;i<belong[r];i++)add[i]+=v,sum[i]+=1ll*len*v;
	}
}ll query(int l,int r,ll ret=0){
	if(belong[l]==belong[r])for(int i=l;i<=r;i++)ret+=a[i]+add[belong[l]];
	else{
		for(int i=l;i<=R[belong[l]];i++)ret+=a[i]+add[belong[l]];
		for(int i=L[belong[r]];i<=r;i++)ret+=a[i]+add[belong[r]];
		for(int i=belong[l]+1;i<belong[r];i++)ret+=sum[i];
	}return ret;
}int main(){
	cin>>n>>q,len=sqrt(n),tot=n/len+(n%len&&1);
	for(int i=1;i<=tot;i++)L[i]=(i-1)*len+1,R[i]=i*len;
	R[tot]=n;
	for(int i=1;i<=n;i++)cin>>a[i],belong[i]=(i-1)/len+1;
	for(int op,l,r,v;q--;){
		cin>>op>>l>>r;
		if(op==1)cin>>v,update(l,r,v);
		if(op==2)cout<<query(l,r)<<'\n';
	}return 0;
}
2024/7/13 11:29
加载中...