声明

笔者最近意外的发现 笔者的个人网站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. 有一棵树,树的每个点有点权,每次有三种操作:
  2.   1. Query x 表示查询以x为根的子树的权值和。
  3.   2. Change x y 表示把x点的权值改为y(0<=y<=100)。
  4.   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的更多相关文章

  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. [百度之星2014资格赛] Disk Schedule 报告

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

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

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

  8. 百度之星2014初赛 - 1002 - Grids

    先上题目: Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  9. 百度之星2014资格赛 1003 - Xor Sum

    先上代码: Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)T ...

随机推荐

  1. imagelist用法

    1.添加一个Imagelist控件,并双击控件图标如下图 2.点击新增按钮

  2. 通过api获取句柄控制其他窗体

    很多时候,编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能,而不需要对方程序为你开放接口.比如,操作飞信定时发送短信等.我之前开发过飞信耗子,用的是对飞信协议进行抓包,然后分析协议,进而模拟协议的 ...

  3. orcal exists

    Oracle使用了一个复杂的自平衡B-tree结构.通常,通过索引查询数据比全表扫描要快.当 Oracle找出执行查询和Update语句的最好路径时,Oracle优化器将使用索引.同样在联结多个表时使 ...

  4. 洛谷P5050 【模板】多项式多点求值

    传送门 人傻常数大.jpg 因为求逆的时候没清零结果调了几个小时-- 前置芝士 多项式除法,多项式求逆 什么?你不会?左转你谷模板区,包教包会 题解 首先我们要知道一个结论\[f(x_0)\equiv ...

  5. NTP搭建指南

    NTP搭建指南 前言: NTP是网络时间协议(Network Time Protocol),用于全球的标准时间(UTC)的校正. 一般NTP 服务有不同的层次:一层是源头NTP 服务器,一层服务器都设 ...

  6. Nginx+Apache动静分离

    Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术.动静分离技术其实是采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项 针对PHP的动 ...

  7. 性能测试—认识JMeter(一)

     性能测试—认识JMeter(一) <零成本web性能测试>第二章 JMeter基础知识总结和自己的理解 一.JMeter百度词条概念 Apache JMeter是Apache组织开发的基 ...

  8. python3入门之函数

    相信大家学习过其他语言,懂得函数的作用.简单的说函数最好的作用就是可以使程序变得懒惰.python作为后起之秀,当然也会拥有函数这个有用的东西: 创建函数 使用def语句即可创建函数,如创建一个用来生 ...

  9. 拓扑排序+DP CF721C Journey

    CF721C Journey 给出一个\(n\)个点\(m\)条边的有向无环图. 问从\(1\)到\(n\),在距离不超过\(k\)的情况下最多经过多少点,并输出一个方案. \(topo\)+\(DP ...

  10. consul部署多台Docker集群

    Consul 最近在学习Ocelot,发现里面集成Consul,所有部署一下多机版集群,后来发现网上都是在一台虚拟机中的Docker部署,而且大同小异,没有真正解释清楚. 前提准备 4台Centos虚 ...