树上路径是可以通过到根的路径和LCA差出来的,所以建立一棵Trie树按位贪心即可......吗?
发现空间并不够,需要我们每层现建,要记录每个数和它异或答案之后在这一层插进去的编号
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lli long long
using namespace std;
const int N=1e6+;
int n,rd,ch,tot;
lli k,sz,ans,val[N];
int a[N],b[N],siz[N],son[N][];
int ID(int nde,int sid)
{
if(!son[nde][sid])
son[nde][sid]=++tot;
return son[nde][sid];
}
void i207M()
{
for(int i=;i<=tot;i++)
son[i][]=son[i][]=siz[i]=;
tot=sz=ch=;
}
int main()
{
scanf("%d%lld",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%lld",&rd,&val[i]),val[i]^=val[rd];
for(int i=;i<=n;i++) a[i]=b[i]=;
for(int i=;~i;i--)
{
i207M();
for(int j=;j<=n;j++)
siz[a[j]=ID(a[j],(val[j]>>i)&)]++;
for(int j=;j<=n;j++)
sz+=siz[son[b[j]][(val[j]>>i)&]];
if(sz<k) k-=sz,ch=,ans+=1ll<<i;
for(int j=;j<=n;j++)
b[j]=son[b[j]][((val[j]>>i)&)^ch];
}
printf("%lld",ans);
return ;
}