【百度之星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
前言
这几天把毕业答辩的事弄完了,于是买票出来玩,结果周六是百度之星的复赛,于是我就没有办法来做比赛了,不过看了看题,目测可以过我两三道题.
今天已经是比赛的第二天了,我还一直没有时间来A掉这些题,今晚抽空先把最简单的线段树那道题A了再说.
正文
题意
题目说的很清楚了,自己看吧.
有一棵树,树的每个点有点权,每次有三种操作:
1. Query x 表示查询以x为根的子树的权值和。
2. Change x y 表示把x点的权值改为y(0<=y<=100)。
3. Root x 表示把x变为根。
分析
这道题的数据起始很弱的.
我最初的想法就可以把这道题过掉.
最初的想法
首先对这个树按1为根dfs根优先编号,这个应该没有什么疑问.
编号的好处是一个子树变为了一个连续的区间.
编号的时候保存一下这个子树的编号区间,保存在子树的根上.
编号的时候顺便计算一下子树的权值和.
编号的时候记录一下一个节点的父节点.
修改操作
先说说修改操作,修改某个节点时,就算出这个节点应该增加多少,然后从这个节点开始更新,一直更新到根1.
平均复杂度 O( log(n) )
最坏复杂度 O( n )
设置根
这里我们需要一个变量来表示目前的根是那个节点,比如使用root变量,默认值是1.
设置根只需要把根变量更新一下即可.
平均复杂度 O( 1 )
最坏复杂度 O( 1 )
查询操作
查询的时候分三种情况:
1.查询的节点是目前的根
这个时候答案显然是整个树的权值和,返回 根1的权值和即可.
2.目前的根不是查询的节点的某个子孙(即根不在查询的子树里面)
这个时候,答案和根是1的情况相同,及直接返回查询节点的权值和即可.
怎么判断根是不是查询节点的子孙呢?
平常的方法是用 LCA 查询,这里我直接使用子树区间来判断即可.
3.目前的根是查询节点的某个子孙.
这个时候,我们想象一下,我们拿起根,查询节点的子孙有那些呢?
即那些会在查询节点的下面呢?
假设查询节点是 x, x的一个儿子是y, 根是y的一个子孙(也可能是y).
这个时候,我们拿起根,x 应该变成 y 的儿子了吧.
这时树的权值应该是 x 原先的权值和 - y 节点的权值和 + 不在x子树区间的全职和.
然后,我们可以发现 x 原先的权值和 + 不在x子树区间的权值和 = 整个树的权值和.
故最终答案是 整个树的权值和 - y节点的权值和.
问题:怎么找到y节点.
有两个方法:
1.枚举x的儿子来判断
2.从根不断的找父亲来判断.
由于题意没有说最多儿子有多少个,所以第一个方法最坏情况下为 O( n ) (很多儿子)
对应的,第二个方法最坏情况下也是 O( n ) (树退化为链表).
不过我们不用管最坏情况,先这样实现了再说.
综合操作复杂度:log(n)
线段数优化
首先对于修改操作,线段树优化后可以使最坏情况达到 O( log( n ) ).
对于查询操作,由于需要知道 x 的那个儿子 y, 这个我目前没有想到 O( log( n ) ) 的方法.
学弟说那只能使用二分了.
但是怎么二分呢?
发现二分不了,不过可以使用随机算法来优化找儿子的效率.
起初我们是遍历x的所有儿子,这里我们随机挑一个儿子来寻找.这也算是一个比较好的优化方法吧.
代码
暴力版代码 https://github.com/tiankonguse/ACM/blob/master/astar/2014/3/2.2.cpp(比较简洁)
线段树优化版代码 https://github.com/tiankonguse/ACM/blob/master/astar/2014/3/2.cpp
对于上面说的几个方法我只实现了两个,其他的都很简单,有兴趣的朋友可以尝试一下.
参考
http://blog.csdn.net/hongrock/article/details/27839237(这个参考主要用于确认暴力不会超时,如果精心构造数据,这个方法会超时的)
【百度之星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/ 站 ...
- [百度之星2014资格赛] Disk Schedule 报告
Disk Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- NOIP2016普及组复赛解题报告
提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:h ...
- 百度之星2014初赛 - 1002 - Grids
先上题目: Grids Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- 百度之星2014资格赛 1003 - Xor Sum
先上代码: Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)T ...
随机推荐
- Rabbimq必备基础之对高级消息队列协议AMQP分析及Rabbitmq本质介绍
MQ的一个产品... [消息队列] 1. MSMQ windows自带的一个服务... [petshop],message存放在文件系统中. 最原始的消息队列... [集群,消息确认,内存化,高可用, ...
- Reporting Service服务SharePoint集成模式安装配置(8、配置用于SharePoint 2010的Reporting service模式)
从SQL Server 2012 起, SQL Server Reporting Service可以完全集成进SharePoint的场,直接作为SharePoint 的组件部分来运行,没有独立的Win ...
- Unity3D 之PC客户端的分辨率自定义
在Player Setting中可以自定义分辨率,但在PC版本中如果使用Display Resolution Dialog选项,会发现在分辨率选项中只有预定义的那些,而并没有在Player Setti ...
- SCPO2015 小凸玩矩阵
题目链接:戳我 二分答案+最大流. 看到第K大的数的最小值是多少,我们想到二分,把他转化为最大数最小问题--二分一个数x,如果有>=n-k+1个数不比它大,那么它就应当不大于当前数,否则应当大于 ...
- 爬虫开发10.scrapy框架之日志等级和请求传参
今日概要 日志等级 请求传参 今日详情 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志 ...
- Django-01Django简介
1 MVC与MTV模型 MVCWeb服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业 ...
- 6.margin塌陷问题
当时说到了盒模型,盒模型包含着margin,为什么要在这里说margin呢?因为元素和元素在垂直方向上margin里面有坑. 我们来看一个例子: <!DOCTYPE html><ht ...
- 【洛谷 5002】专心OI - 找祖先 (树上计数)
专心OI - 找祖先 题目背景 \(Imakf\)是一个小蒟蒻,他最近刚学了\(LCA\),他在手机\(APP\)里看到一个游戏也叫做\(LCA\)就下载了下来. 题目描述 这个游戏会给出你一棵树,这 ...
- 关于web界面设计的整体可维护性的感悟
1.表现与数据分开管理: 某些数据具备特殊的表现格式,比如颜色,大小等等.为了对这些格式表现分开管理进行 a.使用css定义该类型数据的表现形式: 定义数据的类别,通过该类别对数据格式进行统一定义 . ...
- vim编辑器基本操作及文件权限,sudo命令等介绍
一:vim 操作命令,在命令模式下操作 pageup 往上翻页 pagedown 往下翻页 H 移动到屏幕首行 gg 移动光标到文档的首行 前面加数字n表示移动到n行内容 G 移动到文档最后一行/查找 ...