一个很经典的套路 思想是 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 树上求最大异或路径值的更多相关文章

  1. 洛谷 P4149 [IOI2011]Race-树分治(点分治,不容斥版)+读入挂-树上求一条路径,权值和等于 K,且边的数量最小

    P4149 [IOI2011]Race 题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK,且边的数量最小. 输入格式 第一行包含两个整数 n, Kn,K. 接下来 n - 1n−1 行 ...

  2. P4551 最长异或路径

    题目描述 给定一棵 nnn 个点的带权树,结点下标从 111 开始到 NNN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式 ...

  3. 洛谷 P4551 最长异或路径

    题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...

  4. P4551 最长异或路径 (01字典树,异或前缀和)

    题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式: 第一行一 ...

  5. [luogu] P4551 最长异或路径(贪心)

    P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ...

  6. Luogu P4551 最长异或路径

    题目链接 \(Click\) \(Here\) \(01Trie\)好题裸题. 取节点\(1\)为根节点,向下扫每一个点从根节点到它路径上的异或和,我们可以得到一个\(sumx[u]\). 现在路径异 ...

  7. [POJ3764]最长异或路径

    Description: 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. Hint: \(n<=10^5\) Solution: 真是01Trie傻逼题,居 ...

  8. [luogu4551][POJ3764]最长异或路径

    题目描述 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 分析 处理出各个节点到根节点的异或距离,然后我 ...

  9. 01Trie【p4551(poj3764)】 最长异或路径

    题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 个人: 首先强推一下01字典树(T ...

随机推荐

  1. [转] android获取手机信息大全

    原文链接:http://blog.csdn.net/hytfly/article/details/8552483 IMEI号,IESI号,手机型号: private void getInfo() { ...

  2. 1686 第K大区间(尺取+二分)

    1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...

  3. Harmonic Value Description(构造题)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission ...

  4. 海康、大华NVR网络硬盘录像机录像无插件全平台访问实现—录像回放时间轴功能实现方法

    在之前的博文中我们有介绍方案*NVR硬件录像机web无插件播放方案(支持取特定时间段视频流)*:该片博文旨在介绍时间轴功能的实现和相关接口的调用: 时间轴样式展示: 问题分析 对于 时间轴的展示实现需 ...

  5. Null和Undefined类型

    Null和Undefined类型都只有唯一的特殊值,即null和undefined.不过null是关键字而undefined不是. JavaScript把两者定义为相等的,如下代码可以验证: aler ...

  6. 【python】-- Django路由系统(网址关系映射)、视图、模板

    Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...

  7. Eslint使用指南

    本文主要讲如何在前端项目中引入Eslint静态代码检查工具,提升代码质量和统一代码风格,避免一些低级错误. 一 引入静态代码检查工具的目的 在团队协作中,为避免低级 Bug.产出风格统一的代码,会预先 ...

  8. Qt for Android 启动短暂的黑屏或白屏问题如何解决?

    解决方法一: 使用透明主题 点击项目 -> 在 构建设置 里面找到 Build Android APK 栏目,点击 create templates 创建一个 AndroidManifest.x ...

  9. EChars文档

    http://echarts.baidu.com/echarts2/doc/doc.html#SeriesMap http://echarts.baidu.com/option.html

  10. MySQL中InnoDB脏页刷新机制Checkpoint

    我们知道InnoDB采用Write Ahead Log策略来防止宕机数据丢失,即事务提交时,先写重做日志,再修改内存数据页,这样就产生了脏页.既然有重做日志保证数据持久性,查询时也可以直接从缓冲池页中 ...