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 ...
随机推荐
- 《从零开始学Swift》学习笔记(Day 34)——静态属性是怎么回事?
原创文章,欢迎转载.转载请注明:关东升的博客 我先来设计一个类:有一个Account(银行账户)类,假设它有3个属性:amount(账户金额).interestRate(利率)和owner(账户名). ...
- 七、Dockerfile案例三(Mysql安装)
七.Dockerfile案例三(Mysql安装) *特别提醒:新版的mysql:5.7数据库下的user表中已经没有Password字段了(5.5的user表还有) 一.查看docker hub上的版 ...
- EasyGBS国标流媒体服务器GB28181国标方案安装使用文档
EasyGBS - GB28181 国标方案安装使用文档 下载 安装包下载,正式使用需商业授权, 功能一致 在线演示 在线API 架构图 EasySIPCMS SIP 中心信令服务, 单节点, 自带一 ...
- virgo使用指南
一.说明: 一个windows虚拟桌面软件,很小,不到10K,占用内存也极小.超级方便. 二.GitHub地址: henkman/virgo: Virtual desktops for Windows ...
- Sublime Text 3如何快速生成HTML5的头部信息和常用的快捷键
一.快速生成HTML5的头部信息的步骤: 1.Ctrl + N,新建一个文档: 2.Ctrl + Shift + P,打开命令模式,再输入 sshtml 进行模糊匹配,将语法切换到html模式: 3. ...
- GBK和UTF-8文字编码的区别
UTF-8是一种国际化标准的文字编码,我们已知Windows系统程序已经将最初的UTF-8转向Unicode,而GBK的存在是为了中国国情而创造的,不过GBK也将伴随着中文字符的一直流传下去. GBK ...
- Python菜鸟之路:DOM基础
前言 DOM 是 Document Object Model(文档对象模型)的缩写,定义了访问和操作 HTML 文档的标准方法.DOM把网页和脚本以及其他的编程语言联系了起来.DOM属于浏览器,而不是 ...
- Server Objects Extension(SOE)开发(二)
前言 SOE的提供了REST和Soap两种模板,只要在模板特定的方法中添加自己的业务逻辑代码即可,开发流程非常的简单便捷.那怎么知道自己的业务逻辑代码该写在模板的那个方法里面呢?这就需要很好的理解SO ...
- 洛谷 P4171 [JSOI]满汉全席
洛谷 最近刚刚学的2-sat,就刷了这道裸题. 2-sat问题一般是用tarjan求的,当出现(x,y)或(!x,y)或(x,!y)三种选择时,我们可以把!x->y,!y->x连边. 然后 ...
- python函数回顾:all()
描述 all() 函数用于判断给定的可迭代参数 iterable 中的所有元素,是否不为 0.''.False 或者 iterable 为空,如果是返回 True,否则返回 False. 如果是空元组 ...