题意: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:萌萌哒十五酱的礼物~(树,字典树)的更多相关文章

  1. HRBUST 2064:萌萌哒十五酱的宠物~(最近公共祖先LCA)

    题意:一个n个点的树,询问某两点之间的简单路径,问路径上任选三边能否组成一个三角形. N<100000,权值<109 思路: 这里最神奇的思路过于以下这个: n个数,任意三个都不能组成三角 ...

  2. HRBUST - 2069-萌萌哒十五酱的衣服~-multiset-lower_bound

    众所周知,十五酱有很多的衣服,而且十五酱东西收拾的非常糟糕. 所以十五酱经常找不到合适的衣服穿,于是她觉得收拾一下屋子,把衣服配成一套一套的~(即一件衬衫一件裤子. 十五酱一共有n件衣服,有衬衫有裤子 ...

  3. 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)

    一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...

  4. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  5. [HDU1290]献给杭电五十周年校庆的礼物

    [HDU1290]献给杭电五十周年校庆的礼物 题目大意: 问\(n(n\le1000)\)个平面能够将一个三维空间分成几部分. 思路: 公式\(\frac{n^3+5n+6}6\). 源代码: #in ...

  6. HDU 1290 献给杭电五十周年校庆的礼物(面分割空间 求得到的最大空间数目)

    传送门: 献给杭电五十周年校庆的礼物 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  8. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  9. Bootstrap<基础十五> 输入框组

    Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...

随机推荐

  1. NOIP模拟赛 高级打字机

    [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x. ...

  2. LNMP一键安装包开启pathinfo和rewrite模式

    此教程适用于集成安装包lnmp,官网是https://lnmp.org/ 一. 开启pathinfo #注释 下面这一行 #include enable-php.conf #载入新的配置文件 incl ...

  3. Linux系统入门-Bash初识

    目录 Linux系统入门-Bash初识 Bash Shell介绍 Bash Shell的作用 Bash的两种使用方式 命令提示符 shell的基础语法 shell的基本特性 命令补全 linux快捷键 ...

  4. leetcode-6-basic

    解题思路: 这道题真实地反映了我今晚有多脑残=.=只需要从根号N开始向前找,第一个能被N整除的数就是width,然后存到结果就 可以了.因为离根号N越近,width越大,与length的差越小. ve ...

  5. 设置eclipse中的${user}

    打开eclipse根目录找到eclipse.ini文件增加初始配置: -Duser.name=snzigod@hotmail.com 重启eclipse后${user}变量的值就变成了snzigod@ ...

  6. Spring boot 中Spring data JPA的应用(一)

    最近一直在研究Spring Boot,今天为大家介绍下Spring Data JPA在Spring Boot中的应用,如有错误,欢迎大家指正. 先解释下什么是JPA JPA就是一个基于O/R映射的标准 ...

  7. Makefile基础(二)

    上一章:C语言之Makefile基础(一) 上一章的Makefile写的中规中矩,比较繁琐,是为了讲清楚基本概念,其实Makefile有很多灵活的写法,可以写的更简洁,同时减少出错的可能 一个目标依赖 ...

  8. 各浏览器对 window.open() 的支持

    原文地址

  9. Spring-Boot自定义Starter实践

    此文已由作者王慎为授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. disconf-spring-boot-starter 使用方法: 引入maven依赖: <depen ...

  10. 一步一步解剖Libevent源代码 - 0

    本系列文章将在<Libevent源码深度解剖>的基础上,结合Libevent-2.0.22代码,更新了其中的一些定义和说明,以及加上了bufferevent部分.   一.Libevent ...