【百度之星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

參考

时间: 2024-10-05 15:25:16

【百度之星2014~复赛 解题报告~正解】The Query on the Tree的相关文章

【百度之星2014~初赛解题报告】

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛解题报告]>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=671 前言 最近要毕业了,有半年没做比赛了.这次参加百度

【百度之星2014~资格赛解题报告】

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<标题>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=666 前言 最近要毕业了,有半年没做比赛了.这次参加百度之星娱乐一下.现在写一下解题报

【百度之星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=673 前言

百度之星2014复赛 - 1001 - Find Numbers

先上题目: Find Numbers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 26    Accepted Submission(s): 20Special Judge Problem Description 给n个非负整数,满足对于某正整数k,n=2^k-1.从中选出(n+1)/2个数,使得它们的和是(n+1)/2的倍数. I

百度之星2014复赛 - 1002 - The Query on the Tree

先上题目: The Query on the Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 54    Accepted Submission(s): 18 Problem Description 度度熊最近沉迷在和树有关的游戏了,他一直认为树是最神奇的数据结构.一天他遇到这样一个问题: 有一棵树,树的每个点有点权,每次有三种

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

【百度之星2014~初赛(第二轮)解题报告】JZP Set

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]JZP Set>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=668 前言 最近要毕业了,有半年

&lt;百度之星2014资格赛&gt;Disk Schedule 报告

Disk ScheduleTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 780    Accepted Submission(s): 119 Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景. 磁盘有

百度之星2014资格赛 1004 - Labyrinth

先上题目: Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2911    Accepted Submission(s): 1007 Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一