萌新刚学分块20min求条
查看原帖
萌新刚学分块20min求条
967841
__CrossBow_EXE__楼主2025/2/8 17:06

rt,32pts

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define int long long
using namespace std;
int n,f,len;
const int N=500005;
int a[N],id[N],sum[N],add[N],cnt[N];
void op1(int l,int r,int x){
	if(id[l]==id[r]){
		for(int i=l;i<=r;i++){
			a[i]+=x;
			sum[id[i]]+=x;
		}
	}else{
		for(int i=l;id[i]==id[l];i++){
			a[i]+=x;
			sum[id[i]]+=x;
		}
		for(int i=r;id[i]==id[r];i--){
			a[i]+=x;
			sum[id[i]]+=x;
		}
		for(int i=id[l]+1;i<=id[r]-1;i++){
			add[i]+=x;
		}
	}
}
int op2(int l,int r){
	int ans=0;
	if(id[l]==id[r]){
		for(int i=l;i<=r;i++){
			ans+=a[i];
		}
		return ans;
	}else{
		for(int i=l;id[i]==id[l];i++){
			ans+=a[i]+add[id[i]];
		}
		for(int i=r;id[i]==id[r];i--){
			ans+=a[i]+add[id[i]];
		}
		for(int i=id[l]+1;i<=id[r]-1;i++){
			ans+=sum[i]+add[i]*cnt[i];
		}
		return ans;
	}
}
void solve(){
	int op,x,y,k;
	cin>>op;
	if(op==1){
		cin>>x>>y>>k;
		op1(x,y,k);
	}
	if(op==2) {
		cin>>k;
		op1(1,1,k);
	}
	if(op==3){
		cin>>k;
		op1(1,1,-k);
	}
	if(op==4){
		cin>>x>>y;
		cout<<op2(x,y)<<endl;
	}
	if(op==5){
		cout<<op2(1,1)<<endl;
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>n>>f;len=sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		id[i]=i/len;
		sum[id[i]]+=a[i];
		cnt[id[i]]++;
	}
	while(f--){
		solve();
	}
	return 0;
}

2025/2/8 17:06
加载中...