题目

给定一个\(n\)个点的带权无根树,求树上异或和最大的一条路径。

\(n\le 10^5\)

分析

一个简单的例子

相信大家都做过这题:

给定一个\(n\)个点的带权无根树,有\(m\)个询问,要求树上两点之间的权值异或和。

\(n,m\le 10^7\)

Xor运算有一些很显然的性质:

\(a \oplus a = 0\)

\(a \oplus b = b \oplus a\)

\(a\oplus b\oplus c = a\oplus(b\oplus c)\)

对于这道水题,我们只需要随便取一个点作为根节点,预处理节点\(i\)到根节点的路径异或和\(dist[i]\),然后\(a,b\)的路径的异或和即为\(dist[a]\oplus dist[b]\oplus dist[LCA(a,b)]\oplus dist[LCA(a,b)]=dist[a]\oplus dist[b]\)

回到本题

回到我们这题,我们只需要随便取一个点作为根节点,利用dfs处理出每个点到根节点的路径异或和,求这些异或和的最大异或即可,因为它们的LCA到根节点的路径被抵消了。

利用Trie实现求最大异或和。

代码

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5 + 5;

struct edge {
int to, nxt, val;
} edges[MAXN << 1]; int head[MAXN], path[MAXN], trie[MAXN << 5][2], num = 2, tot = 0, cnt = 0, n;
bool vis[MAXN]; void addedge(int from, int to, int val) {
edges[cnt].to = to, edges[cnt].val = val, edges[cnt].nxt = head[from];
head[from] = cnt++;
} void dfs(int x, int w) {
vis[x] = 1;
path[tot++] = w;
for(int i = head[x]; i != -1; i = edges[i].nxt) {
if(!vis[edges[i].to]) {
dfs(edges[i].to, w ^ edges[i].val);
}
}
} void insert(int x) {
int cur = 1;
for(int i = 30; i >= 0; i--) {
int p = (x >> i) & 1;
if(trie[cur][p]) cur = trie[cur][p];
else cur = trie[cur][p] = num++;
}
} int getmaxxor(int x) {
int cur = 1, ans = 0;
for(int i = 30; i >= 0; i--) {
int p = ((x >> i) & 1) ^ 1;
if(trie[cur][p]) {
cur = trie[cur][p];
ans = ans << 1 | 1;
} else {
cur = trie[cur][p ^ 1];
ans <<= 1;
}
}
return ans;
} int main() {
ios::sync_with_stdio(false);
memset(head, 0xff, sizeof(head));
int u, v, w;
cin >> n;
for(int i = 0; i < n - 1; i++) {
cin >> u >> v >> w;
addedge(u, v, w);
addedge(v, u, w);
}
dfs(1, 0);
int ans = 0;
for(int i = 0; i < n; i++) insert(path[i]);
for(int i = 0; i < n; i++) ans = max(ans, getmaxxor(path[i]));
cout << ans << endl;
return 0;
}

【POJ 3764】The Xor-longest Path的更多相关文章

  1. 【POJ 3764】 The xor-longest path

    [题目链接] http://poj.org/problem?id=3764 [算法] 首先,我们用Si表示从节点i到根的路径边权异或和 那么,根据异或的性质,我们知道节点u和节点v路径上的边权异或和就 ...

  2. bzoj 2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...

  3. 【链表】BZOJ 2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 382  Solved: 111[Submit][S ...

  4. BZOJ2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 284  Solved: 82[Submit][St ...

  5. BZOJ2293: 【POJ Challenge】吉他英雄

    2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 80  Solved: 59[Submit][Stat ...

  6. BZOJ2287: 【POJ Challenge】消失之物

    2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 254  Solved: 140[Submit][S ...

  7. BZOJ2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 126  Solved: 90[Submit][Sta ...

  8. BZOJ2296: 【POJ Challenge】随机种子

    2296: [POJ Challenge]随机种子 Time Limit: 1 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 114  Solv ...

  9. BZOJ2292: 【POJ Challenge 】永远挑战

    2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 513  Solved: 201[Submit][ ...

随机推荐

  1. 配置Ubuntu DNS

    首先,你可以在/etc/hosts中加入一些主机名称和这些主机名称对应的IP地址,这是简单使用本机的静态查询.要访问Ubuntu DNS 服务器来进行查询,需要设置/etc/resolv.conf文件 ...

  2. String.format()的用法

    string.format()用法 2011-06-21 14:58:57|  分类: 工作笔记 |  标签:string  format用法   |字号大中小 订阅 1.格式化货币(跟系统的环境有关 ...

  3. 彻底解决Android 应用方法数不能超过65K的问题

    作为一名Android开发者,相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常: Conversion to Dalvik forma ...

  4. 优化Linux的内核参数来提高服务器并发处理能力

    提高Linux系统下的负载能力,可以使用nginx等原生并发处理能力就很强的web服务器 使用Apache的可以启用其Worker模式,来提高其并发处理能力 修改Linux的内核相关TCP参数,来最大 ...

  5. LeetCode Longest Substring Without Repeating Characters 最长不重复子串

    题意:给一字符串,求一个子串的长度,该子串满足所有字符都不重复.字符可能包含标点之类的,不仅仅是字母.按ASCII码算,就有2^8=128个. 思路:从左到右扫每个字符,判断该字符距离上一次出现的距离 ...

  6. pat乙级1050螺旋矩阵

    1.用vector建立二维数组: vector<vector<int>> arr(rows); ; i < rows; i++) arr[i].resize(cols); ...

  7. 打造颠覆你想象中的高性能,轻量级的webform框架---js直接调后台的封装(第三天)

    如果你没有看我第二天写的内容的,我想你是看不懂的!!!! 好了,废话不多说,怎么才能让我们的代码变得牛逼起来呢?怎么封装我们的代码呢?我们不可能 每个页面都需要那样写吧,那我们来一步一步来封装 我们的 ...

  8. POI对EXCEL的操作【重点:如何设置CELL格式为文本格式】

    实际开发过程中通常用到的就是从数据库导出EXCEL表格了,JXL可以这样做,其实POI也可以(关于JXL与POI的异同可访问我之前总结的文章),之前写过POI对七种文档(当然也包括EXCEL)的内容读 ...

  9. python_59_装饰器2

    #匿名函数,无函数名 calc=lambda x:x*3 print(calc(3)) sum=lambda x,y,z:x+y+z print(sum(1,2,3)) ''' 高阶函数 a:把一个函 ...

  10. 【转】mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    mongoDB 学习笔记纯干货(mongoose.增删改查.聚合.索引.连接.备份与恢复.监控等等) http://www.cnblogs.com/bxm0927/p/7159556.html