[POJ 3764] The xor-longest Path (Tire树 + 贪心)
2016-04-07 20:47
441 查看
POJ - 3674
题意是给你一个树,每条边有一个权值,求得树上一条路径,使路径上每条边权值的异或和最大
首先用一个 DFS把根到任意点的路径的异或和求出来 xorv[i]
由异或的性质可得点 u和点 v的异或和即为 xorv[u]^xorv[v] ( 根到两点 LCA的异或和会消去)
然后问题就转化成在区间内找两个值,使得他们的异或和最大
与 LightOJ - 1269一样的做法,用 trie树维护一下,贪心找最大就好
/article/9028258.html
题意是给你一个树,每条边有一个权值,求得树上一条路径,使路径上每条边权值的异或和最大
首先用一个 DFS把根到任意点的路径的异或和求出来 xorv[i]
由异或的性质可得点 u和点 v的异或和即为 xorv[u]^xorv[v] ( 根到两点 LCA的异或和会消去)
然后问题就转化成在区间内找两个值,使得他们的异或和最大
与 LightOJ - 1269一样的做法,用 trie树维护一下,贪心找最大就好
/article/9028258.html
#include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <queue> using namespace std; typedef pair<int,int> Pii; #define MST(a,b) memset(a,b,sizeof(a)) #define CLR(a) MST(a,0) #define LL long long #define ULL unsigned long long int maxx(int a,int b){return a>b?a:b;} int minn(int a,int b){return a<b?a:b;} int abss(int a){return a<0?(-a):a;} const int maxn=1e5+10,noden=maxn*31+10; struct trnode { int now,nxt[2]; }; int N; int edge[2*maxn][4]; int last[maxn]; int xorv[maxn]; int trien; trnode trie[noden]; void adde(int,int,int,int); int dfs(int,int); void insert(int); int findmax(int); int main() { while(~scanf("%d", &N)) { trien=0; CLR(last);CLR(xorv);CLR(trie); for(int i=1; i<N; i++) { int u,v,w; scanf("%d%d%d", &u, &v, &w); adde(u,v,w,i);adde(v,u,w,i+N); } dfs(0,-1); int tmax=0; for(int i=0; i<N; i++) { tmax=maxx(tmax, findmax(xorv[i])); insert(xorv[i]); } printf("%d\n", tmax); } return 0; } void adde(int u, int v, int w, int i) { edge[i][0]=u; edge[i][1]=v; edge[i][2]=w; edge[i][3]=last[u]; last[u]=i; } int dfs(int u, int f) { for(int e=last[u]; e; e=edge[e][3]) { int v=edge[e][1],w=edge[e][2]; if(v==f) continue; xorv[v]=w^xorv[u]; dfs(v,u); } } void insert(int num) { int np=0; for(int i=31; i>=0; i--) { int now=(num&(1<<i))?1:0; if(trie[np].nxt[now]) { np=trie[np].nxt[now]; } else { trie[np].nxt[now]=++trien; np=trien; trie[np].now=now; } } } int findmax(int num) { int np=0; for(int i=31; i>=0; i--) { int now=(num&(1<<i))?1:0; if(trie[np].nxt[now^1]) np=trie[np].nxt[now^1]; else if(trie[np].nxt[now]) np=trie[np].nxt[now]; else break; num^=(trie[np].now)<<i; } return num; }
相关文章推荐
- 分布式版本控制系统Git------初涉Git
- weblogic uddiexplorer的漏洞
- Django中的Model(操作表) - 第五轻柔的code - 博客园
- 筛素数——POJ 2909 Goldbach's Conjecture
- 互斥锁与条件变量
- ROS--tutorial命令记录
- android中的相对布局RelativeLayout
- 生产消费模型实例C++11
- [置顶] windows上node-webkit安装sqlite、socket的那些坑
- 。
- Java基础几个问题
- 1050. 螺旋矩阵(25)
- 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一] E题
- nyoj 91 阶乘之和
- 李娜跟姜山
- 返回一个整数数组中最大子数组的和。
- Js 对 浏览器 的 URL的操作
- OpenCV 无法启动此程序,因为计算机中丢失opencv_core249.dll。请尝试重新安装改程序已解决此问题
- 剑指offer-面试题22.栈的压入,弹出序列
- 客户机程序与服务器程序