题解 CF1446C 【Xor Tree】
遇到这种求最小删除数的题目,都可以转化为求最大保留数。
将题目的题意转化一下,保留最多的数,令只存在一对
自然想到
那么当子树
最后答案就是
#include<cstdio>
int rt=1,tot=1;
int a[200005],ch[4000005][2];
inline int read() {
register int x=0,f=1;register char s=getchar();
while(s>'9'||s<'0') {if(s=='-') f=-1;s=getchar();}
while(s>='0'&&s<='9') {x=x*10+s-'0';s=getchar();}
return x*f;
}
inline int max(const int &x,const int &y) {return x>y? x:y;}
inline void insert(int val) {
int p=rt;
for(register int i=30;i>=0;--i) {
int cur=val>>i&1;
if(!ch[p][cur]) ch[p][cur]=++tot;
p=ch[p][cur];
}
}
inline int GetMaxPoint(int p) {
if(!ch[p][0]&&!ch[p][1]) return 1;
if(!ch[p][0]) return GetMaxPoint(ch[p][1]);
if(!ch[p][1]) return GetMaxPoint(ch[p][0]);
return max(GetMaxPoint(ch[p][0]),GetMaxPoint(ch[p][1]))+1;
}
int main() {
int n=read();
for(register int i=1;i<=n;++i) insert(a[i]=read());
printf("%d\n",n-GetMaxPoint(rt));
return 0;
}