POJ 3764 The xor-longest Path trie树+贪心
2016-08-02 13:51
169 查看
传送门
题目大意:
有一棵带权树,求出树上xor和最大的路径
分析:
先看n<=10W,额,这数据范围就决定了我们不可能使用暴力…(废话>…<),怎么办捏?
我们思考一下,树上的路径可以怎么求,首先,dis[1][i]是可以O(n)预处理的,dis[x][y]是可以由dis[1][x]^dis[1][y]得来的,然后怎么办捏?
反正不能n^2枚举…..
我们可以考虑贪心的做法….我们要求这个数最大,那么就是说要使得这条路径的xor和高位尽可能是1,也就是说,当我们选择下一条边时要尽量选择与当前答案01串相反的数字…(有点混乱… >_<)…
我们可以把每个数字看成一个01串,然后建立一棵字典树,枚举dis[i]然后在字典树上寻找路径,尽量寻找与dis[i]01相反的串,每次更新ans….
代码如下:
by >_< neighthorn
题目大意:
有一棵带权树,求出树上xor和最大的路径
分析:
先看n<=10W,额,这数据范围就决定了我们不可能使用暴力…(废话>…<),怎么办捏?
我们思考一下,树上的路径可以怎么求,首先,dis[1][i]是可以O(n)预处理的,dis[x][y]是可以由dis[1][x]^dis[1][y]得来的,然后怎么办捏?
反正不能n^2枚举…..
我们可以考虑贪心的做法….我们要求这个数最大,那么就是说要使得这条路径的xor和高位尽可能是1,也就是说,当我们选择下一条边时要尽量选择与当前答案01串相反的数字…(有点混乱… >_<)…
我们可以把每个数字看成一个01串,然后建立一棵字典树,枚举dis[i]然后在字典树上寻找路径,尽量寻找与dis[i]01相反的串,每次更新ans….
代码如下:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; const int maxn=100000+5; int n,tot,ans,hd[maxn],to[maxn*2],nxt[maxn*2],w[maxn*2],cnt,dis[maxn]; struct trie{ int nxt[2]; }tr[maxn*20]; inline void init(void){ for(int i=0;i<=tot;i++) for(int j=0;j<=1;j++) tr[i].nxt[j]=0; tot=cnt=ans=0,memset(dis,0,sizeof(dis)),memset(hd,-1,sizeof(hd)); } inline void add(int x,int y,int s){ to[cnt]=y; w[cnt]=s; nxt[cnt]=hd[x]; hd[x]=cnt++; } inline void dfs(int root,int fa){ for(int i=hd[root];i!=-1;i=nxt[i]) if(to[i]!=fa) dis[to[i]]=dis[root]^w[i],dfs(to[i],root); } inline void insert(int word){ int p=0; for(int i=30;i>=0;i--){ int tmp=0; if((word>>i)&1) tmp=1; if(!tr[p].nxt[tmp]) tr[p].nxt[tmp]=++tot; p=tr[p].nxt[tmp]; } } inline int calc(int x){ int p=0,res=0; for(int i=30;i>=0;i--){ int tmp=1; if((x>>i)&1) tmp=0; if(tr[p].nxt[tmp]) res|=(1<<i),p=tr[p].nxt[tmp]; else p=tr[p].nxt[1^tmp]; } return res; } signed main(void){ while(scanf("%d",&n)!=EOF){ init(); for(int i=1,x,y,z;i<n;i++) scanf("%d%d%d",&x,&y,&z),add(x+1,y+1,z),add(y+1,x+1,z); dfs(1,-1);//预处理除dis[1][i] for(int i=1;i<=n;i++) insert(dis[i]); for(int i=1;i<=n;i++) ans=max(ans,calc(dis[i])); printf("%d\n",ans); } return 0; }
by >_< neighthorn
相关文章推荐
- POJ 3764 The xor-longest Path
- POJ 3764 The xor-longest Path
- POJ 3764 The xor-longest Path (01字典树 + DFS)
- POJ 3764 The xor-longest Path
- 【Poj 3764】The xor-longest Path 字典序+贪心
- POJ 3764 The xor-longest Path
- bzoj 1954 & poj 3764 The xor-longest Path dfs+Trie
- POJ 3764 The xor-longest path 字典树异或+dfs
- POJ 3764 The xor-longest Path
- [POJ 3764] The xor-longest Path (Tire树 + 贪心)
- poj 3764 The xor-longest Path
- Poj 3764 The xor-longest Path(Trie树+xor+贪心)
- POJ 3764 The xor-longest Path
- ACM学习历程—POJ 3764 The xor-longest Path(xor && 字典树 && 贪心)
- POJ 3764 The xor-longest Path ( 字典树应用—— 求连续段相异或最大最小的线性算法)(好题)
- POJ 3764 The xor-longest Path
- POJ 3764 The xor-longest Path 字典树 异或性质
- POJ 3764 The xor-longest Path 字典树求最大异或
- poj 3764 The xor-longest Path(字典树)
- trie--- POJ 3764 The xor-longest Path