线段树全WA求调
查看原帖
线段树全WA求调
590386
_LX_楼主2024/3/1 15:27

样例过了,提交全WA

#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T& x) {
	x=0;T f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	x=x*f;
	return;
}
template <typename T,typename ...Arg>void read(T& x,Arg& ...arg){
	read(x);
	read(arg...);
}
template <typename T>void write(T x) {
	if(x<0)putchar('-'),x=-x;
	if(x<10)putchar(x+'0');
	else write(x/10),putchar(x%10+'0');
}
template <typename T,typename ...Arg>void write(T& x,Arg& ...arg){
	write(x);
	putchar(' ');
	write(arg...);
}
#define MAXN 500005
#define L (x<<1)
#define R (x<<1|1)
#define mid ((l+r)>>1)
#define INF 2147483647
int n,m,a[MAXN],b[MAXN];
namespace SegTree{
	struct SGT{
		int l,r,psi,lpsi,rpsi,mx,mn;
		SGT(int l=0,int r=0,int psi=0,int lpsi=0,int rpsi=0,int mx=0,int mn=INF):l(l),r(r),psi(psi),lpsi(lpsi),rpsi(rpsi),mx(mx),mn(mn){}
	}sgt[MAXN<<2];
	inline void pushup(SGT &x,SGT l,SGT r){
		x.mx=max(l.mx,r.mx);
		x.mn=min(l.mn,r.mn);
		x.lpsi=max(l.lpsi,r.mx-l.mn);
		x.rpsi=max(r.rpsi,l.mx-r.mn);
		if(x.r-x.l+1>=3) x.psi=max(max(l.psi,r.psi),max(l.rpsi+r.mx,r.lpsi+l.mx));
		return;
	}
	inline void build(int x,int l,int r){
		sgt[x].l=l,sgt[x].r=r;
		if(l==r){sgt[x].mn=b[l],sgt[x].mx=a[l];return;}
		build(L,l,mid);
		build(R,mid+1,r);
		pushup(sgt[x],sgt[L],sgt[R]);
		return;
	}
	inline void a_update(int x,int l,int v){
		if(sgt[x].l==sgt[x].r&&sgt[x].l==l){sgt[x].mx=v;return;}
		if(sgt[x].l>l||sgt[x].r<l) return;
		a_update(L,l,v);
		a_update(R,l,v);
		pushup(sgt[x],sgt[L],sgt[R]);
		return;
	}
	inline void b_update(int x,int l,int v){
		if(sgt[x].l==sgt[x].r&&sgt[x].l==l){sgt[x].mn=v;return;}
		if(sgt[x].l>l||sgt[x].r<l) return;
		b_update(L,l,v);
		b_update(R,l,v);
		pushup(sgt[x],sgt[L],sgt[R]);
		return;
	}
	inline SGT query(int x,int l,int r){
		if(sgt[x].l>=l&&sgt[x].r<=r) return sgt[x];
		if(sgt[x].r<l||sgt[x].l>r) return SGT{0,0,0,0,0,0,INF};
		SGT LSGT=query(L,l,r),RSGT=query(R,l,r),resSGT=SGT{0,0,0,0,0,0,INF};
		if(!LSGT.l) return RSGT;
		else if(!RSGT.l) return LSGT;
		resSGT.l=LSGT.l,resSGT.r=RSGT.r;
		pushup(resSGT,LSGT,RSGT);
		return resSGT;
	}
}
using namespace SegTree;
signed main(){
	read(n,m);
	for(int i=1;i<=n;i++) read(a[i]);
	for(int i=1;i<=n;i++) read(b[i]);
	build(1,1,n);
	while(m--){
		int opt,x,y;
		read(opt,x,y);
		if(opt==1) a_update(1,x,y);
		else if(opt==2) b_update(1,x,y);
		else write(query(1,x,y).psi),putchar('\n');
	}
	return 0;
}
2024/3/1 15:27
加载中...