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 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...
随机推荐
- NOIP模拟赛 无线通讯网
[题目描述] 国防部计划用无线网络连接若干个边防哨所.2种不同的通讯技术用来搭建无线网络:每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...
- 使用虚拟环境来管理python的包
1.背景 在开发python项目的过程中,我们会用到各种各样的包,我们使用pip来管理包,请看下图我们刚装好python解释器时已安装的包: 但是随着我们疯狂的使用pip install xxx后,系 ...
- 【差分约束】poj1275Cashier Employment
比较经典的差分约束 Description A supermarket in Tehran is open 24 hours a day every day and needs a number of ...
- [图文] Fedora 28 使用 Virt-Manager 创建 KVM 虚拟机以及 配置 KVM 虚拟机
实验说明: 往后的许多实验都将以Linux平台下的 KVM虚拟机为主,所以不可少的就是 Virt-Manager 虚拟机管理器. 本章将对如何安装和使用Virt-Manager管理器进行讲解,并且会对 ...
- day3- python 注册
# .先把文件内容的账号密码放到list/字典 f = open('users') result = f.read() f.close() user_list = result.split() # u ...
- css3属性:美化表单、点击元素产生的背景与边框怎么去掉,滚动回弹效果
- __vet_atags
参考:atags--__vet_atags标签 arch/arm/include/asm/setup.h /* * linux/include/asm/setup.h * * Copyright ...
- Linux学习-Linux 主机上的用户讯息传递
查询使用者: w, who, last, lastlog 如果你想要知道目前已登入在系统上面的用户呢?可以透过 w 或 who 来查询喔!如下范例所示: [root@study ~]# w 01:49 ...
- kettle 增量同步
http://www.cnblogs.com/inuyasha1027/p/Kettle_update_timestamp.html https://ask.hellobi.com/blog/yugu ...
- loj2280 「FJOI2017」矩阵填数
状压 dp.参考there #include <algorithm> #include <iostream> #include <cstring> #include ...