HRBUST 2072:萌萌哒十五酱的礼物~(树,字典树)
题意:n个点的一棵树,树的边上有权值。一条路径的权值定义成这条路径上所有边的权值的xor。问所有路径的最大权值是多少。
思路:
首先,树上任意两点之间的路可以表示成 这两点到根节点的路- 其最近公共祖先到根节点的路*2.那么这里如果是用xor操作,重复的那部分正好就没了。
深搜一边,得出所有点到根节点的权值,这样问题就边成了n个数字,将其中两个xor,问得到的最大值是什么。
然后这里我卡住了……实际上做法非常……
用字典树记录所有这些树(二进制),然后对每一个数,去找现在存在的和它xor之后答案最大的那个数。暴力完n个数就得到答案= =……
坑:深度太深爆栈了。只能自己写。用栈模拟了递归,但感觉又不像是深搜又不像是广搜……兼有两个特点,姑且称为广深搜吧……
新品种:广深搜
实现方法:用栈代替队列实现广搜,就出现这奇特的品种。
优点:代替深搜防爆栈,代替广搜省内存。
缺点:用之前谨慎……看看问题是不是能用这种方法解决。
代码:
/*
* 树上两点之间路径 = 两点到根的路径 - 最近公共祖先到根的路径*2
* 字典树,暴力每个数,找其配对的尽量大的数
* 坑点:dfs 深搜爆栈, 字典树节点要开到至少15倍……(估计最大32倍吧)
*/
#include <cstdio>
#include <cstring>
#define N 100010 struct Graph{
struct Edge{
int to, next, c;
}e[N<<];
int head[N];
int p;
void init() {
memset(head, -, sizeof(head));
p = ;
}
void add(int u, int v, int c) {
e[p].to = v;
e[p].c = c;
e[p].next = head[u];
head[u] = p++;
}
}g; int dis[N]; struct Dictree{
struct Node {
int val[];
void init() {
memset(val, -, sizeof(val));
}
}node[N<<]; // 够么?
int p;
void init() {
node[].init();
p = ;
}
void insert(int x) {
int now = ;
for (int i = ; i >= ; i--) {
int k = ((x>>i)&);
if (node[now].val[k] == -) {
node[p].init();
node[now].val[k] = p++;
}
now = node[now].val[k];
}
}
int find(int x) {
int now = ;
int ans = ;
for (int i = ; i >= ; i--) {
int k = ((x>>i)&);
if (node[now].val[k] == -) {
k = !k;
}
ans = ((ans<<)|k);
now = node[now].val[k];
}
return ans;
} }dict; int stk[N];
void dfs(int now) {
int top = ;
stk[top++] = now;
while (top) {
now = stk[--top];
dict.insert(dis[now]);
for (int i = g.head[now]; i != -; i = g.e[i].next) {
int to = g.e[i].to;
int c = g.e[i].c;
if (dis[to] == -) {
dis[to] = dis[now]^c;
stk[top++] = to;
}
}
}
} int main() {
int n;
while (scanf("%d", &n) != EOF ){
g.init();
for (int i = ; i < n-; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
g.add(a,b,c);
g.add(b,a,c);
}
memset(dis, -, sizeof(dis)); //会不会^出-1?
dis[] = ;
dict.init();
dfs();
int maxans = ;
for (int i = ; i <= n; i++) {
int ans = dis[i]^dict.find(~dis[i]);
if (maxans < ans) maxans = ans;
}
printf("%d\n", maxans);
}
return ;
}
HRBUST 2072:萌萌哒十五酱的礼物~(树,字典树)的更多相关文章
- HRBUST 2064:萌萌哒十五酱的宠物~(最近公共祖先LCA)
题意:一个n个点的树,询问某两点之间的简单路径,问路径上任选三边能否组成一个三角形. N<100000,权值<109 思路: 这里最神奇的思路过于以下这个: n个数,任意三个都不能组成三角 ...
- HRBUST - 2069-萌萌哒十五酱的衣服~-multiset-lower_bound
众所周知,十五酱有很多的衣服,而且十五酱东西收拾的非常糟糕. 所以十五酱经常找不到合适的衣服穿,于是她觉得收拾一下屋子,把衣服配成一套一套的~(即一件衬衫一件裤子. 十五酱一共有n件衣服,有衬衫有裤子 ...
- 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)
一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- [HDU1290]献给杭电五十周年校庆的礼物
[HDU1290]献给杭电五十周年校庆的礼物 题目大意: 问\(n(n\le1000)\)个平面能够将一个三维空间分成几部分. 思路: 公式\(\frac{n^3+5n+6}6\). 源代码: #in ...
- HDU 1290 献给杭电五十周年校庆的礼物(面分割空间 求得到的最大空间数目)
传送门: 献给杭电五十周年校庆的礼物 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 我的MYSQL学习心得(十五) 日志
我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- Bootstrap <基础二十五>警告(Alerts)
警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...
- Bootstrap<基础十五> 输入框组
Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...
随机推荐
- Bootstrap 模态框 禁止点击空白关闭模态框事件
在模态框的div中加上 aria-hidden="true" data-backdrop="static" <div class="modal ...
- Python学习笔记:re模块(正则表达式)
本文是部分内容参考自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html,虽然这篇博客是基于Python2.4的老版本,但是基础的P ...
- SQL前后端分页
/class Page<T> package com.neusoft.bean; import java.util.List; public class Page<T> { p ...
- Linux学习-systemctl 针对 service 类型的配置文件
systemctl 配置文件相关目录简介 现在我们知道服务的管理是透过 systemd,而 systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目录内. 该目录的 ...
- CSS 预处理器框架
CSS 预处理器框架 可以按照需求来使用别人的代码 1.sass (compass) 2.less (lesshat/EST) 3.提供现成的 mixin 4.类似 JS 类库 ,封装常用功能 css ...
- CodeForces 519E 树形DP A and B and Lecture Rooms
给出一棵树,有若干次询问,每次询问距两个点u, v距离相等的点的个数. 情况还挺多的,少侠不妨去看官方题解.^_^ #include <iostream> #include <cst ...
- php msql 表单
http://www.cnblogs.com/webers/p/3849707.html
- 编程哲学之 C# 篇:007——如何创造万物
上帝拥有创建万物的能力,本文介绍创造万物的道,让你也拥有上帝般创造万物的能力! 道 中国哲学家,道家学派创始人--老子,在<道德经>写到: 道生一,一生二,二生三,三生万物 那么,是什么 ...
- kafka消息的可靠性
本文来自网易云社区 作者:田宏增 Kafka的高可靠性的保障来源于其健壮的副本(replication)策略.通过调节其副本相关参数,可以使得Kafka在性能和可靠性之间运转的游刃有余.Kafka从0 ...
- Leetcode6--->Zigzag Conversion(将给定字符串按照Z字排列,输出结果)
题目:给定一个字符串s,一个整数numRows, 将字符串s按照竖Z的方式排列,然后输出结果: 举例:String s = "PAYPALISHIRING"; 排列后为: P A ...