HRBUST 2072 树上求最大异或路径值
一个很经典的套路 思想是 F [u,v] = F[1,u] ^ F[1,v]
这样就转化成了n个数两两异或 求最大值 可以用字典树来做 每次用当前数去树中寻求最大xor值 然后把这个数字插进去 就相当于这个数字和之前所有的数字都比较了
发现自从学习了kdtree等一群数据结构之后...写什么都想学线段树的写法..好像很不错啊..?
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
#include<iostream>
#include<string>
#include<vector>
#include<queue>
using namespace std;
#define L long long
#define pb push_back const L maxn = 100050 ; L n ;
vector<L >q[maxn] ;
vector<L >w[maxn] ;
L f[maxn] ;
bool vis[maxn] ; void bfs(L u) {
queue<L > que ;
que.push(u) ;
que.push(0) ;
while(!que.empty()) {
L u = que.front() ; que.pop() ;
L ff = que.front() ; que.pop() ;
for(L i = 0 ; i < q[u].size() ; i ++ ){
L v = q[u][i] ;
if(vis[v]) {
vis[v] = false ;
f[v] = ff ^ w[u][i] ;
que.push(v) ;
que.push(f[v]) ;
}
}
}
} L a[50] ;
struct node {
L l , y ;
}b[35 * maxn];
L cnt ;
L e[50] ; L did() {
L qs = 0 ;
L de = 0 ;
L res = 0;
while(de + 1 <= 32) {
L nd = de + 1 ;
if(a[nd] == 1) {
if(b[qs].l != -1) {
res += e[nd] ;
qs = b[qs].l ;
}
else if(b[qs].y != -1) {
res += 0 ;
qs = b[qs].y ;
}
else return res ;
}
else {
if(b[qs].y != -1) {
res += e[nd] ;
qs = b[qs].y ;
}
else if(b[qs].l != -1) {
res += 0 ;
qs = b[qs].l ;
}
else return res ;
}
de = nd ;
}
return res ;
} void inse() {
L qs = 0 ;
L de = 0 ;
while(de + 1 <= 32) {
L nd = de + 1 ;
if(a[nd] == 0) {
if(b[qs].l == -1) {
b[qs].l = (++cnt) ;
qs = b[qs].l;
b[qs].l = -1 ;
b[qs].y = -1 ;
}
else {
qs = b[qs].l ;
}
}
else {
if(b[qs].y == -1) {
b[qs].y = (++cnt) ;
qs = b[qs].y;
b[qs].l = -1 ;
b[qs].y = -1 ;
}
else {
qs = b[qs].y ;
}
}
de = nd ;
}
} int main(){
while(scanf("%lld",&n) != EOF) {
for(L i = 1 ; i <= n ; i ++ )q[i].clear() ;
for(L i = 1 ; i <= n ; i ++ )w[i].clear() ;
for(L i = 1 ; i < n ; i ++ ){
L u , v , c;
scanf("%lld%lld%lld",&u,&v,&c) ;
q[u].pb(v);
q[v].pb(u);
w[u].pb(c);
w[v].pb(c);
}
e[32] = 1 ;
for(L j = 31 ; j >= 1 ; j -- ) {
e[j] = 2*e[j+1] ;
}
memset(vis,true,sizeof(vis));
f[1] = 0 ;
vis[1] = false;
bfs(1) ;
cnt = 0 ;
b[cnt].l = -1;
b[cnt].y = -1;
L ans = 0 ;
for(L i = 1 ; i <= n ; i ++ ){
L x = f[i];
for(L j = 32 ; j >= 1 ; j -- ) {
a[j] = x%2 ;
x /= 2 ;
}
L res = did() ;
if(ans < res) ans = res ;
inse() ;
}
printf("%lld\n",ans) ;
}
}
// 好像还是第一次写字典树 ..
HRBUST 2072 树上求最大异或路径值的更多相关文章
- 洛谷 P4149 [IOI2011]Race-树分治(点分治,不容斥版)+读入挂-树上求一条路径,权值和等于 K,且边的数量最小
P4149 [IOI2011]Race 题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK,且边的数量最小. 输入格式 第一行包含两个整数 n, Kn,K. 接下来 n - 1n−1 行 ...
- P4551 最长异或路径
题目描述 给定一棵 nnn 个点的带权树,结点下标从 111 开始到 NNN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式 ...
- 洛谷 P4551 最长异或路径
题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...
- P4551 最长异或路径 (01字典树,异或前缀和)
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式: 第一行一 ...
- [luogu] P4551 最长异或路径(贪心)
P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ...
- Luogu P4551 最长异或路径
题目链接 \(Click\) \(Here\) \(01Trie\)好题裸题. 取节点\(1\)为根节点,向下扫每一个点从根节点到它路径上的异或和,我们可以得到一个\(sumx[u]\). 现在路径异 ...
- [POJ3764]最长异或路径
Description: 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. Hint: \(n<=10^5\) Solution: 真是01Trie傻逼题,居 ...
- [luogu4551][POJ3764]最长异或路径
题目描述 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 分析 处理出各个节点到根节点的异或距离,然后我 ...
- 01Trie【p4551(poj3764)】 最长异或路径
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 个人: 首先强推一下01字典树(T ...
随机推荐
- 48、ViewFlow ---- 滑动广告页
<!-- main.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearL ...
- Youth Is Not a Time of Life
Youth is not a time of life; it is a state of mind.青春不是年华,而是心境: It is not a matter of rosy cheeks, r ...
- 控制bin文件夹里面的dll不复制到临时目录中( <hostingEnvironment shadowCopyBinAssemblies="false" />)
One of the things that makes developing ASP.NET applications very cool is that you can rapidly proto ...
- 理解CSS3属性transition
一.说明 1.1 定义和用法 transition 属性是一个简写属性,用于设置四个过渡属性: transition-property:规定设置过渡效果的CSS属性的名称. transition-du ...
- Datetime 模块求日期差
Datetime 模块求日期差 导入 datetime 模块/实例化当前时间对象 调用.date() 方法 得到当前年/月/日时间 实例化时间差对象 delta 求当前日期减去时间差 delta 后的 ...
- Python3.6全栈开发实例[006]
6.检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者. dic = {"k1": "v1v1", " ...
- (4.11)DBCC 常用命令
三.DBCC状态.验证.其他语句 跟踪标识全集:https://www.cnblogs.com/lyhabc/articles/4092507.html 状态语句DBCC INPUTBUFFER 显示 ...
- ubuntu ping响应慢的解决(转)
新装ubuntu之后感觉上网老是很慢,ping网站时每次ping指令都需要很久才能有响应,不过网络延迟却正常.后来发现是因为/etc/nsswitch.conf文件中hosts的配置有问题,做如下修改 ...
- github常用的git命令
添加已有项目到github: touch README.md //新建说明文件 git init //在当前项目目录中生成本地git管理,并建立一个隐藏.git目录 git add . //添加当前目 ...
- spring项目报org.apache.tiles.definition.DefinitionsFactoryException: I/O错误原因及解决办法。
今天升级一个spring项目遇到如下错: HTTP Status 500 - Request processing failed; nested exception is org.apache.til ...