解题: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

猜你喜欢

转载自www.cnblogs.com/ydnhaha/p/10458916.html
xor