zoukankan      html  css  js  c++  java
  • 解题: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
  • 相关阅读:
    手机兼容性测试
    Monkey测试
    ADB常用指令
    ADB移动端测试
    关于虚拟网卡V1,V8的问题
    1
    排序算法
    查找算法
    二叉树的计算
    队列
  • 原文地址:https://www.cnblogs.com/ydnhaha/p/10458916.html
Copyright © 2011-2022 走看看