Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 5646 | Accepted: 1226 |
Description
In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of edges on p:
⊕ is the xor operator.
We say a path the xor-longest path if it has the largest xor-length. Given an edge-weighted tree with n nodes, can you find the xor-longest path?
Input
The input contains several test cases. The first line of each test case contains an integer n(1<=n<=100000), The following n-1 lines each contains three integers u(0 <= u < n),v(0 <= v < n),w(0 <= w < 2^31), which means there is an edge between node u and v of length w.
Output
Sample Input
- 4
- 0 1 3
- 1 2 4
- 1 3 6
Sample Output
- 7
Hint
The xor-longest path is 0->1->2, which has length 7 (=3 ⊕ 4)
题意:给出一颗n个节点的边权树,求一条路径(u,v),使得路径上的边的权值异或值最大
思路:我们可以先0为根,求出其他节点i到根的路径的边权异或值d[i],对于u,v之间路径的边权异或结果就是d[u]^d[v], 那么问题转化为给出n个数,求任意两个异或的最大值
把每一个数以二进制形式从高位到低位插入trie中,然后依次枚举每个数,在trie中贪心,即当前为0则向1走,为1则向0走。
一开始写动态分配节点的trie一直tle。。。
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- #include <queue>
- #include <vector>
- using namespace std;
- typedef long long ll;
- const int N = ;
- int n;
- struct Edge {
- int v, w, nex;
- Edge() {}
- Edge(int v, int w, int nex) : v(v), w(w), nex(nex) {}
- };
- Edge e[N << ];
- int head[N], tot;
- void add(int u, int v, int w) {
- e[tot] = Edge(v, w, head[u]);
- head[u] = tot++;
- }
- void read() {
- memset(head, -, sizeof head);
- tot = ;
- int u, v, w;
- for(int i = ; i < n; ++i) {
- scanf("%d%d%d", &u, &v, &w);
- add(u, v, w);
- add(v, u, w);
- }
- }
- int d[N], vis[N];
- void bfs() {
- queue<int> que;
- que.push();
- d[] = ;
- memset(vis, , sizeof vis);
- int u, v, w;
- vis[] = ;
- while(!que.empty()) {
- u = que.front(); que.pop();
- for(int i = head[u]; ~i; i = e[i].nex) {
- v = e[i].v; w = e[i].w;
- if(vis[v]) continue;
- d[v] = d[u] ^ w;
- vis[v] = ;
- que.push(v);
- }
- }
- }
- int ch[N * ][];
- struct Trie {
- int sz;
- Trie() { sz = ; memset(ch[], , sizeof ch[]); }
- void _insert(int bs[]) {
- int u = ;
- for(int i = ; i >= ; --i) {
- int c = bs[i];
- if(!ch[u][c]) {
- memset(ch[sz], , sizeof ch[sz]);
- ch[u][c] = sz++;
- }
- u = ch[u][c];
- }
- }
- int _search(int bs[]) {
- int u = , ans = ;
- for(int i = ; i >= ; --i) {
- int c = bs[i];
- if(c == ) {
- if(ch[u][]) { ans += ( << (i)); u = ch[u][]; }
- else u = ch[u][];
- }else {
- if(ch[u][]) { ans += ( << (i)); u = ch[u][]; }
- else u = ch[u][];
- }
- }
- return ans;
- }
- };
- int ans;
- int b[];
- void get(int x) {
- int ls = ;
- memset(b, , sizeof b);
- while(x) {
- b[ls++] = x % ;
- x >>= ;
- }
- }
- void solve() {
- Trie mytrie;
- ans = ;
- for(int i = ; i < n; ++i) {
- get(d[i]);
- mytrie._insert(b);
- ans = max(ans, mytrie._search(b));
- }
- printf("%d\n", ans);
- }
- int main() {
- // freopen("in.txt", "r", stdin);
- while(~scanf("%d", &n)) {
- read();
- bfs();
- solve();
- }
- }
Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值的更多相关文章
- poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12731 Accepted: 544 ...
- poj3764 The XOR Longest Path【dfs】【Trie树】
The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10038 Accepted: ...
- 题解 bzoj1954【Pku3764 The xor – longest Path】
做该题之前,至少要先会做这道题. 记 \(d[u]\) 表示 \(1\) 到 \(u\) 简单路径的异或和,该数组可以通过一次遍历求得. \(~\) 考虑 \(u\) 到 \(v\) 简单路径的异或和 ...
- 51Nod - 1295:XOR key (可持久化Trie求区间最大异或)
给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求ALL 至 ARR 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值 ...
- poj 1004:Financial Management(水题,求平均数)
Financial Management Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 126087 Accepted: ...
- SGU 275 To xor or not to xor 高斯消元求N个数中选择任意数XORmax
275. To xor or not to xor The sequence of non-negative integers A1, A2, ..., AN is given. You are ...
- POJ 1149:PIGS 网络流经典题
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18345 Accepted: 8354 Description ...
- hdu 5265 技巧题 O(nlogn)求n个数中两数相加取模的最大值
pog loves szh II Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- ACM学习历程—POJ 3764 The xor-longest Path(xor && 字典树 && 贪心)
题目链接:http://poj.org/problem?id=3764 题目大意是在树上求一条路径,使得xor和最大. 由于是在树上,所以两个结点之间应有唯一路径. 而xor(u, v) = xor( ...
随机推荐
- 我的vimrc
set nocompatible set langmenu=en_USlet $LANG= 'en_US' source $VIMRUNTIME/vimrc_example.vim source $V ...
- 无中间变量交换swap(a,b)
#include <stdio.h> /* 加减法 整型.浮点型(损失精度) */ void swap1(int *a,int *b) { *a=*a+*b; *b=*a-*b; *a=* ...
- 手机设计尺寸 - iPhone界面尺寸
参考网址: http://www.qijishow.com/down/app-index.htm iPhone界面尺寸 设备 分辨率 PPI 状态栏高度 导航栏高度 标签栏高度 iPhone6 plu ...
- http状态代码-转载
一些常见的状态码为: 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务不可用 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 100 ( ...
- React入门
一.引入Reactjs 方法一:直接下载相关js文件引入网页,其中react.js 是 React 的核心库,react-dom.js 是提供与 DOM 相关的功能,Browser.js 的作用是将 ...
- combobox实现模糊查询自动填充
利用winform设计软件界面时,经常用到combobox控件,但有时需要绑定数据表中的数据,更进一步,需要实现对数据表中数据的模糊查询功能.本文就讲讲述如何用C#实现combobox下拉列表的模糊查 ...
- seo优化urlrewrite伪静态技术
1.下载urlrewrite-3.2.0.jar 2.在WEB-INF下增加urlrewrite.xml <?xml version="1.0" encoding=" ...
- there's no qt version assigned to this project for platform
VS+Qt编译一个新建的项目报there's no qt version assigned to this project for platform xxx的错误. 解决方案: 打开Qt_vs_add ...
- (转)REDIS各项配置参数介绍
# 默认情况下,redis不是在后台模式运行的,如果需要在后台进程运行,把该项的值更改为yes,默认为no daemonize:是否以后台daemon方式运行 # 如redis服务以后台进程运行的时候 ...
- Flask 框架入门
Flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 安装 Flask 依赖两个外部库, We ...