分块板子调一下
  • 板块学术版
  • 楼主zhuoheng
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/17 09:18
  • 上次更新2025/1/17 12:48:52
查看原帖
分块板子调一下
1023698
zhuoheng楼主2025/1/17 09:18

求区间最大值单点修改的板子题
被老师卡了,1e6的数据RE了一个点
不知道如何解决

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10,INF=0x3f3f3f3f; 
int n,m,a[N],L[1001],R[1001],mx[1001],q,b[N];
signed main(){
	//freopen("1.txt","r",stdin);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	q=sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i],b[i]=(i-1)/q+1,mx[b[i]]=max(a[i],mx[b[i]]);
		if(b[i]!=b[i-1])L[b[i]]=i,R[b[i-1]]=i-1;
	}
	R[b[n]]=n;
	while(m--){
		string c;
		int x,y;
		cin>>c>>x>>y;
		if(c[0]=='C'){
			if(y>a[x])mx[b[x]]=max(mx[b[x]],y),a[x]=y;
			else if(a[x]!=mx[b[x]])a[x]=y;
			else{
				int k=b[x];a[x]=y,mx[k]=-INF;
				for(int i=L[k];i<=R[k];i++)mx[k]=max(mx[k],a[i]);
			}
		}
		else{
			int res=-INF;
			if(x>y)swap(x,y);
			if(b[x]==b[y]){
				for(int i=x;i<=y;i++)res=max(a[i],res);
				cout<<res<<'\n';
				continue;
			}
			for(int i=x;i<=R[b[x]];i++)res=max(a[i],res);
			for(int i=b[x]+1;i<b[y];i++)res=max(res,mx[i]);
			for(int i=L[b[y]];i<=y;i++)res=max(res,a[i]);
			cout<<res<<'\n';
		}
	}
}


2025/1/17 09:18
加载中...