C. Xor Tree(分治)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C. Xor Tree(分治)相关的知识,希望对你有一定的参考价值。
C. Xor Tree(分治)
从最高位开始分组,如果最高位都相同则继续递归下一位。
否则分成两部分,显然具有相同位的数才可能相连。
需要注意的情况就是某一个部分只有一个数时,是可以与另一个集合相连通的。
所以我们就取集合较大的那一部分+1,作为答案数组,其他的都删掉。
然后递归终止条件直接返回1.
int n;
vector<int>a;
int dfs(int x,int l,int r){
if(l==r) return 1;
if(!(a[l] & x) || (a[r] & x)) return dfs(x>>1,l,r);
int m;
for(int i=l;i<=r;i++) if(a[i] & x) m=i;
return 1+ max(dfs(x>>1,l,m),dfs(x>>1,m+1,r));
}
int main(){
scanf("%d",&n);
a.resize(n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a.begin(),a.end(),greater<int>());
printf("%d\\n",n-dfs(1<<29,0,n-1));
return 0;
}
以上是关于C. Xor Tree(分治)的主要内容,如果未能解决你的问题,请参考以下文章
Namomo Spring Camp 2022 Div1 XOR Inverse Codeforces Round #673 (Div. 1) C. XOR Inverse 按位贪心模拟/字典树分治
Namomo Spring Camp 2022 Div1 XOR Inverse Codeforces Round #673 (Div. 1) C. XOR Inverse 按位贪心模拟/字典树分治