Luogu P4551 最长异或路径
题目链接 \(Click\) \(Here\)
\(01Trie\)好题裸题。
取节点\(1\)为根节点,向下扫每一个点从根节点到它路径上的异或和,我们可以得到一个\(sumx[u]\)。
现在路径异或和有两类:
- 跨过根节点,这种的异或路径长度等于两个子节点的\(sumx\)异或和异或起来的数值大小
- 在一棵子树中,这种的异或路径等于\(sumx[u]\)异或上\(sumx[v]\)再异或掉两次\(sumx[1->lca (u, v)]\)(因为被额外计算),依然等于两个子节点的\(sumx\)异或和异或起来的数值大小。
所以问题转为求在\(sumx\)中,对每个\(sumx[u]\),和它产生最大异或和的\(sumx[v]\)最大可以异或出来多少。我们把数列每个值插入\(01Trie\)中,求解时尽可能选择对应位不同的数。复杂度\(O(N*31)\)
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int cnt, head[N];
struct edge {
int nxt, to, w;
}e[N << 1];
void add_edge (int from, int to, int val) {
e[++cnt].nxt = head[from];
e[cnt].to = to;
e[cnt].w = val;
head[from] = cnt;
}
void add_len (int u, int v, int w) {
add_edge (u, v, w);
add_edge (v, u, w);
}
int n, u, v, w, sumx[N];
void get_sumx (int u, int fa) {
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v != fa) {
sumx[v] = sumx[u] ^ e[i].w;
get_sumx (v, u);
}
}
}
int ch[N * 31][2], max_size;
void insert (int val) {
int now = 0;
for (int i = 30, to = 0; i >= 0; --i) {
to = ((val & (1 << i)) != 0); //如果 val 第 i 位上为 1
if (!ch[now][to]) {
ch[now][to] = ++max_size;
}
now = ch[now][to];
}
}
int get_ans (int val) {
int now = 0, ans = val;
for (int i = 30; i >= 0; --i) {
if (ans & (1 << i)) {
//这一位为1 -> 向0走
if (ch[now][0] != 0) {
now = ch[now][0];
} else {
val ^= (1 << i);
now = ch[now][1];
}
} else {
//为0 -> 向1走
if (ch[now][1] != 0) {
val ^= (1 << i);
now = ch[now][1];
} else {
now = ch[now][0];
}
}
}
return max (val, ans);
}
int main () {
cin >> n;
for (int i = 1; i <= n - 1; ++i) {
cin >> u >> v >> w;
add_len (u, v, w);
}
get_sumx (1, 0);
for (int i = 1; i <= n; ++i) {
insert (sumx[i]);
}
int ans = 0;
for (int i = 1; i <= n; ++i) {
ans = max (ans, get_ans (sumx[i])); //求sumx与其他数的最大异或
}
cout << ans << endl;
}
Luogu P4551 最长异或路径的更多相关文章
- [luogu] P4551 最长异或路径(贪心)
P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ...
- Luogu P4551 最长异或路径 01trie
做一个树上前缀异或和,然后把前缀和插到$01trie$里,然后再对每一个前缀异或和整个查一遍,在树上从高位向低位贪心,按位优先选择不同的,就能贪出最大的答案. #include<cstdio&g ...
- P4551 最长异或路径
题目描述 给定一棵 nnn 个点的带权树,结点下标从 111 开始到 NNN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式 ...
- 洛谷 P4551 最长异或路径
题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...
- P4551 最长异或路径 (01字典树,异或前缀和)
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式: 第一行一 ...
- 洛谷P4551 最长异或路径
传送门:https://www.luogu.org/problem/show?pid=4551 在看这道题之前,我们应懂这道题怎么做:给定n个数和一个数m,求m和哪一个数的异或值最大. 一种很不错的做 ...
- 2018.10.26 洛谷P4551 最长异或路径(01trie)
传送门 直接把每个点到根节点的异或距离插入01trie. 然后枚举每个点在01trie上匹配来更新答案就行了. 代码: #include<iostream> #include<cst ...
- luoguP4551最长异或路径
P4551最长异或路径 链接 luogu 思路 从\(1\)开始\(dfs\)求出\(xor\)路径.然后根据性质\(x\)到\(y\)的\(xor\)路径就是\(xo[x]^xo[y]\) 代码 # ...
- 【ybt高效进阶2-4-3】【luogu P4551】最长异或路径
最长异或路径 题目链接:ybt高效进阶2-4-3 / luogu P4551 题目大意 给定一棵 n 个点的带权树,结点下标从 1 开始到 N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指 ...
随机推荐
- cuda编程-并行规约
利用shared memory计算,并避免bank conflict:通过每个block内部规约,然后再把所有block的计算结果在CPU端累加 代码: #include <cuda_runti ...
- JQuery invoke remote webservice
Sending the Access-Control-Allow-Origin header allows basic cross-origin access, but calling ASP.NET ...
- 第四十一天 socker server和 event
今日内容 1.基于TCP的socketserver 2.基于UDP的socketserver 3.event 一.TCP的socketserver #服务器 import socketserver f ...
- Windows服务一直“正在启动”怎么杀
转载:https://blog.csdn.net/huanglong8/article/details/71156848 PS:cmd 记得使用 管理员身份运行 这里需要通过控制台 命令行来查询PID ...
- 【BZOJ1011】【HNOI2008】遥远的行星 误差分析
题目大意 给你\(n,b\),还有一个数列\(a\). 对于每个\(i\)求\(f_i=\sum_{j=1}^{bi}\frac{a_ja_i}{i-j}\). 绝对误差不超过\(5\%\)就算对. ...
- 【Gym 100947I】What a Mess
BUPT 2017 summer training (for 16) #1D 题意 找到n个数里面有多少对具有倍数关系.\(1 ≤ n ≤ 10^4,2 ≤ a_i ≤ 10^6\) 题解 枚举一个数 ...
- 【UVALive - 6534 】Join two kingdoms (树的直径的期望)
bupt spring training for 2015 #2nd J 题意 给两棵树,分别有 n,m 个节点(1 ≤ N, Q ≤ 4 × 10^4),等概率连接属于不同树的两个节点,求新树的直径 ...
- python学习日记(装饰器的补充)
如何返回被装饰函数的函数名及注释? 问题及实现 先看典型的装饰器: def wrapper(f):#装饰器函数,f是被装饰函数 def inner(*args,**kwargs): '''执行函数之前 ...
- 洛谷CF1071E Rain Protection(计算几何,闵可夫斯基和,凸包,二分答案)
洛谷题目传送门 CF题目传送门 对于这题,我无力吐槽. 虽然式子还是不难想,做法也随便口胡,但是一些鬼畜边界情况就是判不对. 首先显然二分答案. 对于每一个雨滴,它出现的时刻我们的绳子必须落在它上面. ...
- Android ListView item 点击事件失效问题的解决
关于ListView点击无效,item无法相应点击事件的问题,网上有很多, 大致可分为俩种情况, 一种是 item中存在 ImageButton 等可以点击的组件,这会抢先获得ListView的焦点. ...