BZOJ1954 Pku3764 The xor-longest Path

来源:互联网 发布:mac 删除 旺旺 编辑:程序博客网 时间:2024/06/06 23:16

傻逼题……

树上任意两两点间路径异或和等于两点到根路径的异或和的异或值

把所有点到根的异或和插到trie里然后查即可

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<vector>#include<map>#include<set>#include<bitset>#include<queue>#include<stack>using namespace std;#define MAXN 100010#define MAXM 4000010#define INF 1000000000#define MOD 1000000007#define eps 1e-8#define ll long longstruct vec{int to;int fro;int v;};vec mp[MAXN*2];int tai[MAXN],cnt;int s[MAXN];int n;int rt,tot;int son[MAXM][2],siz[MAXM];int ans;inline void be(int x,int y,int z){mp[++cnt].to=y;mp[cnt].fro=tai[x];tai[x]=cnt;mp[cnt].v=z;}inline void bde(int x,int y,int z){be(x,y,z);be(y,x,z);}void ins(int &x,int d,int y){if(!x){x=++tot;}siz[x]++;if(d==-1){return ;}ins(son[x][(y>>d)&1],d-1,y);}void dfs(int x,int f){int i,y;ins(rt,30,s[x]);for(i=tai[x];i;i=mp[i].fro){y=mp[i].to;if(y!=f){s[y]=s[x]^mp[i].v;dfs(y,x);}}}int ask(int x,int d,int y){if(d==-1){return 0;}if(siz[son[x][(y>>d)&1^1]]){return (1<<d)+ask(son[x][(y>>d)&1^1],d-1,y);}return ask(son[x][(y>>d)&1],d-1,y);}int main(){int i,x,y,z;scanf("%d",&n);for(i=1;i<n;i++){scanf("%d%d%d",&x,&y,&z);bde(x,y,z);}dfs(1,0);for(i=1;i<=n;i++){ans=max(ans,ask(rt,30,s[i]));}printf("%d\n",ans);return 0;}/**/


0 0
原创粉丝点击