题目链接:https://ac.nowcoder.com/acm/contest/317/C
题意理解清楚:星球a走到星球b,只需要Pa>Pb即可,不需要管飞船此时耐力值为多少。
这是一个无向完全图,又有a^b=b^a,所以只需要把比星球1耐力值小,比星球n耐力值大的耐力放入线性基即可,通过线性基构造最后的解。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const double epos=1e-8;
int tt[3009];
int a[3009];
int b[13];
int main(){
int n,t=0,x;
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d",&tt[i]);
for(int i=1;i<n-1;++i)
if(tt[i]<tt[0]&&tt[i]>tt[n-1])
a[t++]=tt[i];
if(n==1){
printf("%d\n",(tt[0]?tt[0]:-1));
return 0;
}
if(tt[0]<=tt[n-1]){
printf("-1\n");
return 0;
}
for(int i=0;i<t;++i)
for(int j=13;j>=0;--j)
if(a[i]&(1<<j)){
if(!b[j]){
b[j]=a[i];
break;
}
a[i]^=b[j];
}
int res=tt[0]^tt[n-1];
for(int i=13;i>=0;--i)
if(b[i])
res=max(res,res^b[i]);
printf("%d\n",res);
return 0;
}