【百度之星2014~复赛 解题报告~正解】The Query on the Tree
声明
笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明。
郑重声明:这篇记录《【百度之星2014~复赛 解题报告~正解】The Query on the Tree》转载自 http://tiankonguse.com/的这条记录:http://tiankonguse.com/record/record.php?id=674
前言
昨天写了 The Query on the Tree 的解题报告,但是遗留下一个问题,不能算是完美解决这道题.
因为如果精心构造数据的话,昨天的题解还是会被卡住的.
今天中午睡觉的时候突然想起一个不会被卡住的方法.
但是由于早上玩了一会类似与宠物消消的弱智游戏,于是怎么也停不下来了.
一个下午的时光也浪费在了这个弱智游戏上.
到了晚上,手机终于没电了,于是来写写这道题的完美解决方法.
这样无论怎么构造数据,tiankonguse都不用担心程序超时了.
正文
题意
有一棵树,树的每个点有点权,每次有三种操作:
1. Query x 表示查询以x为根的子树的权值和。
2. Change x y 表示把x点的权值改为y(0<=y<=100)。
3. Root x 表示把x变为根。
现在度度熊想请更聪明的你帮助解决这个问题。
背景
这篇记录和昨天那一篇紧密相连,建议看看那个记录.
传送门(http://tiankonguse.com/record/record.php?id=673)
背景简述
对于这道题,首先需要对树按1为根优先编号.
编号的时候记录子树的权值和以及子树的编号范围.
这样设置根的一般复杂度是O(1), 修改的一般复杂度是O( log( n ) ), 查询的一般复杂度也是 O( log( n ) ).
修改的最坏复杂度是O( n ), 我们可以使用线段树来优化到O( log( n ) ).
对于查询分了三部分,其中有一部分最坏情况下复杂度也是 O( n ).
当时往二分优化上想了,但是目前的信息不满足二分的条件,所以二分不了.
二分优化查询
假设目前查询的是x, root 是根, y 是x的某个儿子, root 在 y 的那个子树上.
问题1:我们要二分搜索什么?
我们要搜索y这个节点.
问题2:搜索的序列有递增或递减的特增吗?
我们要搜的区间是 left[x]到 left[root], 其中 left[x] 最小,left[y] 不能确定在那个地方,也不知道 left[y] 的值.
问题三:有人说可以使用欧拉序列加树状数组做这道题,是吗?
欧拉序列是什么呢?
原来欧拉序列也对树dfs编号了,只不过进入每个儿子的时候都对当前子树根编号,最后结束时再遍一次号,储存的信息貌似很丰富.
问题四:如果我们也使用欧拉序列或者欧拉序列的思想,可以二分吗?
貌似可以.
因为这时x的每个儿子前面一定有一个编号是x.
而我们需要的是 root 前面的第一个 x.
又由于 x 是区间内最小值,所以通过二分这个最小值就可以搜到 y 了.
问题五:最坏复杂度怎么呀?
由于需要二分,所以最少是 O( log( n ) ).
每次都需要判断,所以这个我们需要通过线段树来优化,可以优化到 log( n ).
这样综合复杂度就是 O( log( n ) ^ 2 )
问题六:那你能实现吗?
这个当然可以,就是一个二分加线段树.
总结
针对昨天遗留下的问题,这里简单的总结一下解决方法.
遗留的问题是查询的时候,如果root是查询节点x的子孙时,我们需要找到x的某个儿子y,这个儿子y还是root的祖先.
这个查找过程用昨天的方法最坏复杂度是O( n ) 的.
这里我找到一个方法:对树dfs编号的时候,每次在儿子前面都添加一个根节点,即把用根节点把各个儿子为根的子树分开.
这样我们就可以使用二分查找x的儿子y了.
因为root前面第一个编号为x的节点和y前面第一个编号为x的节点是相同的.
而且第一个编号为x的节点的下一个节点就是y节点.
由于x还是整个区间的最小值,所以我们就可以通过二分区间最小值来找到root前面的第一个编号为x的节点了.
代码
二分优化查询(其他的暴力的代码)https://github.com/tiankonguse/ACM/blob/master/astar/2014/3/2.3.cpp
完整版的代码(两个线段树写为一个了):https://github.com/tiankonguse/ACM/blob/master/astar/2014/3/2.4.cpp
参考
无
【百度之星2014~复赛 解题报告~正解】The Query on the Tree的更多相关文章
- 【百度之星2014~复赛)解题报告】The Query on the Tree
声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...
- 百度之星2014复赛 - 1002 - The Query on the Tree
先上题目: The Query on the Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- 百度之星2014复赛 - 1001 - Find Numbers
先上题目: Find Numbers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 【百度之星2014~初赛(第二轮)解题报告】Chess
声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...
- 【百度之星2014~初赛(第二轮)解题报告】JZP Set
声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...
- LeetCode解题报告——Convert Sorted List to Binary Search Tree & Populating Next Right Pointers in Each Node & Word Ladder
1. Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted in ...
- [百度之星2014资格赛] Disk Schedule 报告
Disk Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 百度之星2014资格赛 1004 - Labyrinth
先上题目: Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- NOIP2016普及组复赛解题报告
提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:h ...
随机推荐
- 修改mysql时区的三种方法
方法一:通过mysql命令行模式下动态修改 1.1 查看mysql当前时间,当前时区 > select curtime(); #或select now()也可以 +-----------+ | ...
- Delphi webbrowser 的一些方法
因为一个任务,最近几天一直在研究Webbrowser的相关功能,下面是收集到的一些方法 //根据URL获取请求Headerfunction GetAllHeaders(URL: string): st ...
- .net 有参属性 index (索引)
public class IndexTempte { public ArrayList nameList = new ArrayList(); public string this[int index ...
- java-设计模式汇总整理
最近,对各种模式做了一个整理,便于后续自用. 1.工厂模式 总结:很好理解,一个接口,2个类实现这个接口,那么可以用“接口 变量=new 接口实现类”的方式调用不同的实现类,调用方式直接使用接口的方法 ...
- centos 7 安装mysql5.6rpm格式
1查看是否安装了mysql rpm -qa|grep -i mysql 如果安装了请卸载:rpm -e --nodeps MySQL... 2.没有安装则进行如下操作 下载mysql rpm ta ...
- MySQL不带where条件的UPDATE和DELETE 限制操作说明
本文来自 网易云社区 . 数据安全是业务的基石,但是DBA 总会遇到救火情况,业务误删除全表或者误更新错全表业务数据,导致服务不可用 sql_safe_updates参数可以限制不带where条件的u ...
- pageadmin CMS Sql新建数据库和用户名教程
用pageadmin网站制作如何Sql新建数据库和用户名 sql server软件安装完毕后,需要新建一个数据库用来作为网站的数据库. 1.打开sql管理界面,如图所示,找到数据库,右键单击数据库,选 ...
- Template 动画
如果设置Template的动画,也就意味着对每一个具有此Template的对象进行动画处理. 比如对ListBoxI的ItemTemplate进行设置,添加动画,触发器等,每一个ListBoxItem ...
- 初学python - 脚本文件
解析: 第一行 #!/usr/bin/env python - py脚本运行环境[用python解释器解释脚本文件-对应python安装路径] 第二行 #-*-coding:utf-8-*- - ...
- 洛谷P3613 睡觉困难综合征
传送门 题解 人生第一道由乃…… 做这题之前应该先去把这一题给切掉->这里 我的题解->这里 然后先膜一波zsy大佬和flashhu大佬 大体思路就是先吧全0和全1的都跑答案,然后按位贪心 ...