首页 > 代码库 > [BZOJ1954]The xor-longest Path
[BZOJ1954]The xor-longest Path
设c[x]为x到根的xor路径异或和
那么a->b的xor路径异或和为c[a]^c[b]
因为lca(a,b)到根的xor路径异或和被抵消了
所以我们要做的就是dfs一遍求出c[i]然后找到max{c[i]^c[j]}
这个时候我们可以用trie求出答案
1 #include<stdio.h> 2 struct node{ 3 int to,next,v; 4 node(){to=next=v=0;} 5 }e[200001]; 6 int tree[3200001][2],h[100001],xorsum[100001],n,i,a,b,c,tot; 7 void add(int x,int y,int v){ 8 tot++; 9 e[tot].to=y; 10 e[tot].next=h[x]; 11 e[tot].v=v; 12 h[x]=tot; 13 } 14 void dfs(int fa,int x){ 15 for(int i=h[x];i;i=e[i].next){ 16 if(e[i].to!=fa){ 17 xorsum[e[i].to]=xorsum[x]^e[i].v; 18 dfs(x,e[i].to); 19 } 20 } 21 } 22 void insert(int root,int x,int p){ 23 if(p<0)return; 24 if(!tree[root][(x&(1<<p))>>p]){ 25 tot++; 26 tree[root][(x&(1<<p))>>p]=tot; 27 } 28 insert(tree[root][(x&(1<<p))>>p],x,p-1); 29 } 30 int findxor(int root,int x,int p){ 31 if(p<0)return 0; 32 if(tree[root][!(x&(1<<p))]) 33 return((!(x&(1<<p)))<<p)|findxor(tree[root][!(x&(1<<p))],x,p-1); 34 else 35 return(x&(1<<p))|findxor(tree[root][x&(1<<p)],x,p-1); 36 } 37 int max(int a,int b){return a>b?a:b;} 38 int main(){ 39 scanf("%d",&n); 40 tot=0; 41 for(i=1;i<n;i++){ 42 scanf("%d%d%d",&a,&b,&c); 43 add(a,b,c); 44 add(b,a,c); 45 } 46 xorsum[1]=0; 47 dfs(0,1); 48 tot=0; 49 a=0; 50 for(i=1;i<=n;i++)insert(0,xorsum[i],30); 51 for(i=1;i<=n;i++)a=max(a,findxor(0,xorsum[i],30)^xorsum[i]); 52 printf("%d",a); 53 }
[BZOJ1954]The xor-longest Path
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。