CF1849F
Solution
有趣的题目,昨晚写了个
考虑异或最基本的一个性质:如果
很容易想到二分答案之后对于所有
我们证明一个引理:如果
证明:考虑
那么单独考虑这一位,只可能是
那么显然,对于
因此只有
我的做法是在二分答案后用 Trie 树优化建图,这样最多
代码:
#include<bits/stdc++.h>
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=200000+10;
int n,a[MAXN],b[MAXN],rev[MAXN],col[MAXN],tmp; vector<int> G[MAXN];
void dfs(int u,int c) {
if(col[u]!=-1) return tmp&=(col[u]==c),void();
col[u]=c; for(auto v:G[u]) dfs(v,c^1);
return ;
}
int solve(int m) {
tmp=1,memset(col,-1,sizeof(col)); ffor(i,1,n) G[i].clear();
ffor(i,1,n) ffor(j,i+1,min(n,i+3)) if((b[i]^b[j])<m) G[i].push_back(j),G[j].push_back(i);
ffor(i,1,n) if(col[i]==-1) dfs(i,1);
return tmp;
}
int bfind(int l,int r) {
int ans=-1,mid;
while(l<=r) {
mid=l+r>>1;
if(solve(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n; ffor(i,1,n) cin>>a[i];
vector<pair<int,int>> vc; ffor(i,1,n) vc.push_back({a[i],i});
sort(vc.begin(),vc.end());
ffor(i,1,n) b[i]=vc[i-1].first,rev[vc[i-1].second]=i;
if(n==2) return cout<<10,0;
int ans=bfind(0,(1<<30)-1),h=solve(ans);
ffor(i,1,n) cout<<col[rev[i]];
return 0;
}