解题:CF1055F Tree and XOR
作者:互联网
树上路径是可以通过到根的路径和LCA差出来的,所以建立一棵Trie树按位贪心即可......吗?
发现空间并不够,需要我们每层现建,要记录每个数和它异或答案之后在这一层插进去的编号
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define lli long long 5 using namespace std; 6 const int N=1e6+60; 7 int n,rd,ch,tot; 8 lli k,sz,ans,val[N]; 9 int a[N],b[N],siz[N],son[N][2]; 10 int ID(int nde,int sid) 11 { 12 if(!son[nde][sid]) 13 son[nde][sid]=++tot; 14 return son[nde][sid]; 15 } 16 void i207M() 17 { 18 for(int i=1;i<=tot;i++) 19 son[i][0]=son[i][1]=siz[i]=0; 20 tot=sz=ch=0; 21 } 22 int main() 23 { 24 scanf("%d%lld",&n,&k); 25 for(int i=2;i<=n;i++) 26 scanf("%d%lld",&rd,&val[i]),val[i]^=val[rd]; 27 for(int i=1;i<=n;i++) a[i]=b[i]=1; 28 for(int i=62;~i;i--) 29 { 30 i207M(); 31 for(int j=1;j<=n;j++) 32 siz[a[j]=ID(a[j],(val[j]>>i)&1)]++; 33 for(int j=1;j<=n;j++) 34 sz+=siz[son[b[j]][(val[j]>>i)&1]]; 35 if(sz<k) k-=sz,ch=1,ans+=1ll<<i; 36 for(int j=1;j<=n;j++) 37 b[j]=son[b[j]][((val[j]>>i)&1)^ch]; 38 } 39 printf("%lld",ans); 40 return 0; 41 }View Code
标签:include,XOR,int,nde,Tree,son,ch,sid,CF1055F 来源: https://www.cnblogs.com/ydnhaha/p/10458916.html