[bzoj1954] Pku3764 The xor-longest Path

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj1954] Pku3764 The xor-longest Path相关的知识,希望对你有一定的参考价值。

  一开始以为是点权然后一直不会写QAQ

  读完题发现是边权...

  u到v的路径异或和=根到u的路径异或和 异或 根到v的路径异或和

  拿个trie或者是线段树记录一下就好了

技术分享
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 const int maxn=100233;
 8 struct zs{int too,pre,dis;}e[maxn<<1];int tot,last[maxn];
 9 int a[maxn],val[maxn];
10 int ch[maxn*32][2],tt;
11 int i,j,k,n,m,ans;
12 bool s[33];
13  
14 int ra;char rx;
15 inline int read(){
16     rx=getchar(),ra=0;
17     while(rx<0||rx>9)rx=getchar();
18     while(rx>=0&&rx<=9)ra*=10,ra+=rx-48,rx=getchar();return ra;
19 }
20 void dfs(int x,int fa){
21     for(int i=last[x];i;i=e[i].pre)if(e[i].too!=fa)
22         val[e[i].too]=val[x]^e[i].dis,dfs(e[i].too,x);
23 }
24 inline void insert(int a,int b,int c){
25     e[++tot].too=b,e[tot].dis=c,e[tot].pre=last[a],last[a]=tot,
26     e[++tot].too=a,e[tot].dis=c,e[tot].pre=last[b],last[b]=tot;
27 }
28 void ins(int v){
29     int i,now=0;
30     for(i=30;i>=0;i--)s[30-i]=(v&(1<<i))>0;
31     for(i=0;i<=30;i++){
32         if(!ch[now][s[i]])ch[now][s[i]]=++tt,now=tt;
33         else now=ch[now][s[i]];
34     }
35 }
36 int query(int v){
37     int i,now=0,ans=0;
38     for(i=30;i>=0;i--)s[30-i]=(v&(1<<i))>0;
39     for(i=0;i<=30;i++)
40         if(ch[now][s[i]^1])now=ch[now][s[i]^1],ans|=1<<(30-i);
41         else now=ch[now][s[i]];
42     return ans;
43 }
44 int main(){
45     n=read();
46     for(i=1;i<n;i++)j=read(),k=read(),insert(j,k,read());
47     dfs(1,0);
48     for(i=1;i<=n;i++)ans=max(ans,query(val[i])),ins(val[i]);
49     printf("%d\\n",ans);
50 }
View Code

 

以上是关于[bzoj1954] Pku3764 The xor-longest Path的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1954: Pku3764 The xor-longest Path

BZOJ1954: Pku3764 The xor-longest Path

bzoj1594 Pku3764 The xor-longest Path

[BZOJ1954]The xor-longest Path

POJ 3764 The xor-longest Path

POJ 3764 The xor-longest Path