奇怪的T30
查看原帖
奇怪的T30
802681
wangziyue_AK楼主2024/3/12 17:50

只拿到了第一、二个测试点的分,其他都TLE。但理论上复杂度只有O(m*log(n)),自认为代码效率不比线段树低,但跑得就是慢。

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m,a[N],b[N];
struct xx{
	int amx,bmi,lx,rx,ans;
};
xx qiu(int l,int r){
	xx ret;
	if(l==r){
		ret.amx=a[l],ret.bmi=b[l];
		return ret;
	}
	int mid=(l+r)>>1;
	xx res1=qiu(l,mid),res2=qiu(mid+1,r);
	ret.amx=max(res1.amx,res2.amx);
	ret.bmi=min(res1.bmi,res2.bmi);
	ret.lx=res1.amx-res2.bmi;
	ret.rx=res2.amx-res1.bmi;
	if(l+1==r) return ret;
	ret.lx=max(ret.lx,res1.lx);
	ret.rx=max(ret.rx,res1.rx);
	ret.ans=res1.lx+res2.amx;
	if(r-mid>=2){
		ret.lx=max(ret.lx,res2.lx);
		ret.rx=max(ret.rx,res2.rx);
		ret.ans=max(ret.ans,res2.rx+res1.amx);
	}
	if(mid-l+1>=3) ret.ans=max(ret.ans,res1.ans);
	if(r-mid>=3) ret.ans=max(ret.ans,res2.ans);
	//printf("%d %d %d %d %d %d %d\n",l,r,ret.amx,ret.bmi,ret.lx,ret.rx,ret.ans);
	return ret;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) scanf("%d",&b[i]);
	int op,l,r;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&op,&l,&r);
		if(op==1) a[l]=r;
		else if(op==2) b[l]=r;
		else{
			xx res=qiu(l,r);
			printf("%d\n",res.ans);
		}
	}
	return 0;
} 
2024/3/12 17:50
加载中...