声明

笔者最近意外的发现 笔者的个人网站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的更多相关文章

  1. 【百度之星2014~复赛)解题报告】The Query on the Tree

    声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...

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

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

    先上题目: Find Numbers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

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

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

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

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  6. 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 ...

  7. [百度之星2014资格赛] Disk Schedule 报告

    Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  8. 百度之星2014资格赛 1004 - Labyrinth

    先上题目: Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. NOIP2016普及组复赛解题报告

    提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:h ...

随机推荐

  1. MVC4 View 的呈现

    一 ActionResult: 1. EmptyResult: Action方法返回的ActionResult对象被ActionInvoker 调用以实现对当前请求的响应,不论Action方法是否具有 ...

  2. c#设计模式系类:亨元模式

    一.引言 在软件开发过程中,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次去申请内存空间了,这样可能出现内存使用越来越多的情况,这样的问题是非常 ...

  3. 使用PLSQL Developer时中文乱码问题

    使用PLSQL Developer时中文乱码问题 一.问题: 执行一些查询结果有中文的SQL语句,显示不了中文,显示???. 二.产生的原因: 客户端与服务器端的编码不一致造成的. 三.解决方案: 1 ...

  4. android相对布局中控件的常用属性

    Android布局属性详解 RelativeLayout用到的一些重要的属性: 第一类:属性值为true或false android:layout_centerHorizontal 水平居中 andr ...

  5. 用Echarts的力向导图可视化数据

    学习背景:做一个图论的题目的时候需要将结果可视化来直观的看效果,所以使用Echarts来画.感觉效果不错. Echarts下载地址:https://echarts.baidu.com/download ...

  6. 淘宝内部分享:MySQL & MariaDB性能优化 【转】

    MySQL· 5.7优化·Metadata Lock子系统的优化 背景 引入MDL锁的目的,最初是为了解决著名的bug#989,在MySQL 5.1及之前的版本,事务执行过程中并不维护涉及到的所有表的 ...

  7. UITableView定制左滑效果

    UITableViewRowAction类 object defines a single action to present when the user swipes horizontally in ...

  8. 976 AlvinZH想回家(背包DP大作战T)

    976 AlvinZH想回家 思路 如果在第i小时有一些飞机延误,那么一架飞机的c值越大,这一小时产生的损失也越大.而使这一小时产生的损失尽可能的小并不会导致接下来时间产生的损失增大.因此应当每一小时 ...

  9. 最新 php oracle 数据库连接 数据库分页

    php 5连接 oracle 10g php oracle 分页 <?php//buyicode studio 20/12/2009//总记录数$sql = "select ROWNU ...

  10. SQLmap源码分析之框架初始化(一)

    SQLmap是现在搞web人手一个的注入神器,不仅包含了主流数据库的SQL注入检测,而且包含提权以及后渗透模块.基于python2.x开发而成,使用方便.所以研究web安全少不了分析源码,学习代码的同 ...