标准01树,网上说O(n^3)能过,我写的递归建树超时辣鸡题目
因为有卡常数的成分在里面,优化之后7S过,写的复杂一点铁定超时
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <iostream>
#include <stdlib.h>
#include <deque>
//#include <windows.h>
using namespace std;
long long inf[2010];
long long tt;
long long jjj,iii;
long long val[38000];
struct node
{
int x[2];
int num;
}tree[38000];
void in(long long u,int cnt)
{
int root=1;
for(int i=32;i>=0;i--)
{
int id=(u>>i)&1;
if(!tree[root].x[id])
tree[root].x[id]=++tt;
root=tree[root].x[id];
tree[root].num+=cnt;
}
val[root]=u;
}
long long anss(long long u)
{
int root=1;
for(int i=32;i>=0;i--)
{
int id=(u>>i)&1;
if(id==1)
{
if(tree[root].x[0]&&tree[tree[root].x[0]].num)
root=tree[root].x[0];
else
root=tree[root].x[1];
}
else
{
if(tree[root].x[1]&&tree[tree[root].x[1]].num)
root=tree[root].x[1];
else
root=tree[root].x[0];
}
}
return val[root];
}
int add(long long k)
{
in(k,1);
return 0;
}
int dela(long long k)
{
in(k,-1);
return 0;
}
int main()
{
long long i,t,j,k,l,m,n,xxx,jj;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
memset(tree,0,sizeof tree);
memset(val,0,sizeof val);
xxx=-1;
tt=1;
for(i=0;i<n;i++)
{
scanf("%lld",&k);
inf[i]=k;
add(k);
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
k=inf[i]+inf[j];
dela(inf[i]);
dela(inf[j]);
l=anss(k);
add(inf[i]);
add(inf[j]);
k=inf[i]+inf[j];
xxx=max(xxx,k^l);
}
}
printf("%lld\n",xxx);
}
return 0;
}