分块求调!!!
查看原帖
分块求调!!!
726098
hytallenxu楼主2024/5/19 17:16
#include <bits/stdc++.h>
#define int long long
#define max(a,b) (a<b?b:a)
#define mp make_pair
#define pb push_back
using namespace std;
using i64 = long long;
int n,q,cnt=0;
const int maxn=2e5+10,maxb=sqrt(maxn)+10;
vector<int> arr(maxn,0);
i64 belong[maxn],tag[maxb],mini[maxb],sum[maxb],l[maxb],r[maxb];

int cntMin(int x, int y){
	int xx=belong[x],yy=belong[y];
	i64 ans=4e18;
	if(xx==yy){
		for(int i=x;i<=y;i++){
			ans=min(ans,arr[i]+tag[xx]);
		}
		return ans;
	}else{
		for(int i=xx+1;i<=yy-1;i++){
			ans=min(ans,mini[i]);
		}
		for(int i=x;i<=r[xx];i++)ans=min(ans,arr[i]+tag[xx]);
		for(int i=l[yy];i<=y;i++)ans=min(ans,arr[i]+tag[yy]);
		return ans;
	}
}

void pushMin(int block){
	mini[block]=4e18;
	for(int i=l[block];i<=r[block];i++){
		mini[block]=min(mini[block],arr[i]);
	}
}

void add(int x, int y, int k){
	int xx=belong[x],yy=belong[y];
	if(xx==yy){
		for(int i=x;i<=y;i++) arr[i]+=k,sum[xx]+=k;
		pushMin(xx);
	}else{
		for(int i=xx+1;i<=yy-1;i++) sum[i]+=(r[i]-l[i]+1)*k,tag[i]+=k,mini[i]+=k;
		for(int i=x;i<=r[xx];i++)arr[i]+=k,sum[xx]+=k;
		for(int i=l[yy];i<=y;i++)arr[i]+=k,sum[yy]+=k;
		pushMin(xx),pushMin(yy);
	}
}

int cntSum(int x, int y){
	int xx=belong[x],yy=belong[y],ans=0;
	if(xx==yy){
		for(int i=x;i<=y;i++)ans+=arr[i]+tag[xx];
		return ans;
	}else{
		for(int i=xx+1;i<=yy-1;i++)ans+=sum[i];
		for(int i=x;i<=r[xx];i++)ans+=arr[i]+tag[xx];
		for(int i=l[yy];i<=y;i++)ans+=arr[i]+tag[yy];
		return ans;
	}
}

signed main(){
	//ios::sync_with_stdio(0);
	//cin.tie(nullptr);cout.tie(nullptr);

	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>arr[i];
	int block=sqrt(n),t=n/block;
	if(n%block) t++;
	for(int i=1;i<=t;i++){
		l[i]=(i-1)*block+1;
		r[i]=i*block;
		tag[i]=sum[i]=0;mini[i]=4e18;
	}
	r[t]=n;
	for(int i=1;i<=n;i++){
		belong[i]=(i-1)/block+1;
		mini[belong[i]]=min(arr[i],mini[belong[i]]);
		sum[belong[i]]+=arr[i];
	}
	char op;int x, y;
	while(q--){
		cin>>op>>x>>y;
		if(op=='M'){
			cout<<cntMin(x,y)<<"\n";
		}else if(op=='P'){
			int k;
			cin>>k;
			add(x,y,k);
		}else{
			cout<<cntSum(x,y)<<"\n";
		}
	}

	return 0;
}

悬2关

2024/5/19 17:16
加载中...