加上这条语句AC但过不了样例 不加这条语句过了样例但九十分
查看原帖
加上这条语句AC但过不了样例 不加这条语句过了样例但九十分
178259
anideahe楼主2022/1/21 11:12
#include<cstdio>
#include<algorithm>
using namespace std;
int max(int x,int y){return x>y?x:y;}
const int N=5e4+5,inf=0x3f3f3f3f; 
int n,ans,tot,pre[N],nxt[N];
int a[N],rt[N*400],siz[N*400],ch[N*400][2];
pair<int,int> b[N];
void add(int x,int &k,int i,int p){
	siz[k=++tot]=siz[x]+1;
	int d=(p>>i)&1;
	ch[k][d^1]=ch[x][d^1];
	ch[k][d]=ch[x][d];
	if(i<0) return ;
	add(ch[x][d],ch[k][d],i-1,p);
}
int query(int l,int r,int i,int p){
	if(i<0) return 0;
	int d=(p>>i)&1;
	int s=siz[ch[r][d^1]]-siz[ch[l][d^1]];
	if(s)
		return query(ch[l][d^1],ch[r][d^1],i-1,p)|(1<<i);
	else
		return query(ch[l][d],ch[r][d],i-1,p);
}
int main(){
	scanf("%d",&n);
	nxt[0]=1,pre[n+1]=n;
	for(int i=1;i<=n;i=-~i){
		scanf("%d",a+i);
		pre[i]=i-1,nxt[i]=i+1;
		b[i]=make_pair(a[i],i);
		add(rt[i-1],rt[i],32,a[i]);
	} 
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i=-~i){
		int x=b[i].second;
		int l1=pre[x ],r1=nxt[x ];
		int l2=pre[l1],r2=nxt[r1];
		nxt[l1]=r1,pre[r1]=l1;
//		if(l1>=1)
			ans=max(ans,query(rt[l2+1-1],rt[r1-1],32,a[x]));
//		if(r1<=n)
			ans=max(ans,query(rt[l1+1-1],rt[r2-1],32,a[x]));
	}
	printf("%d",ans);
	return 0;
}
2022/1/21 11:12
加载中...