`
tiankonguse
  • 浏览: 16221 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【百度之星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(这个参考主要用于确认暴力不会超时,如果精心构造数据,这个方法会超时的)

0
0
分享到:
评论

相关推荐

    2006年百度之星程序设计大赛复赛第4题 彩球游戏(zuma) 解法

    2006年的百度之星程序设计大赛复赛中,第四题便是基于这个游戏机制设定的算法挑战。本题要求参赛者编写程序解决Zuma游戏中的消除策略,以达到最高的得分效率。 在Zuma游戏中,玩家控制一个可移动的彩球,目标是通过...

    百度之星2010复赛 A+B问题代码 (参考)

    标题中的“百度之星2010复赛 A+B问题代码(参考)”指的是一个编程竞赛的问题,这通常是指参赛者需要解决的一个基础算法题目。在编程竞赛中,A+B问题是一个非常经典且基础的题目类型,它要求参赛者编写程序来计算两...

    2007年百度之星程序设计大赛复赛题目

    【标题】和【描述】提及的是两道程序设计竞赛题目,分别是“好心的出租车司机”和“Robots.txt 协议”。这两道题目考察的是参赛者的算法设计和错误处理能力,同时也涉及到实际问题的解决。 在“好心的出租车司机”...

    百度之星09复赛题目

    百度之星09复赛题目 8个小时4道题 百度之星程序设计大赛由百度公司发起创办于2005年,旨在为广大程序设计爱好者搭建一个比试身手、切磋交流的平台。09年百度之星程序设计大赛是连续举办的第五届。大赛每年邀请喜欢...

    NOIP2017普及组复赛解题报告1.doc

    NOIP2017普及组复赛解题报告 本文档是 NOIP2017 普及组复赛的解题报告,包含三道题的解题思路和代码实现。下面将逐一介绍每道题的知识点和解决方法。 第一题:成绩 score 这道题目非常简单,考察了基本的运算符...

    2014天津合泰杯复赛技术报告汇编

    2014年天津市合泰杯 复赛技术报告汇编 由于&gt;60M,所以分为两部分上传

    百度之星2011试题合集(初赛、复赛及决赛)

    ### 百度之星2011试题合集分析 #### 图标排列问题解析 ##### 问题背景 在百度应用平台上,工程师们面临一个问题:如何更好地推荐应用给用户,以提高用户体验。他们注意到,同一开发者开发的应用往往具有相似的图标...

    2019年 百度之星大赛资料 包含初赛 复赛 题解答案 问题解答 .rar

    根据【压缩包子文件的文件名称列表】: "百度之星大赛",我们可以推测这个压缩包内可能包含了一系列子文件夹或文件,每个都对应着不同阶段的比赛,比如“初赛题目”、“复赛题目”、“官方答案”、“选手解题思路”等...

    noip2009普及组复赛解题报告

    【NOIP2009普及组复赛解题报告】 本次解题报告主要涉及两道题目,分别是多项式输出和分数线划定。 **第一题:多项式输出** 这是一道要求根据输入的多项式系数,按照特定格式输出多项式的题目。算法分析如下: 1....

    百度之星历年试题

    【百度之星历年试题】是关于中国著名互联网巨头百度举办的一项技术竞赛——百度之星的历年考试题目集合。这个压缩包包含了2005年至2007年以及2011年的初赛和复赛试题,格式为PDF,方便学习者进行查阅和练习。 百度...

    NOIP2017普及组复赛解题报告

    ### NOIP2017普及组复赛解题报告知识点详解 #### T1: 预编译指令、文件操作及输入输出 本题考察的是编程基础能力,具体包括: - **预编译指令**:预编译指令是C/C++语言的一个特性,用于在程序编译之前对源代码...

    百度之星题目(2005-2010)

    《百度之星程序设计大赛:2005-2010年试题解析》 自2005年起,百度公司主办的"百度之星"程序设计大赛成为每年一度的IT界盛事,吸引了无数编程爱好者和专业选手参与。该比赛不仅检验了参赛者的编程技巧,也推动了...

    百度之星十年试题集

    ### 百度之星十年试题集知识点总结 #### 百度之星程序设计大赛概览 - **背景介绍**:“百度之星”是由百度公司主办的一项面向全国大学生的程序设计竞赛,自2005年起至今已成功举办多届。该比赛旨在通过算法挑战激发...

    NOIP2014普及组复赛试题

    NOIP2014普及组复赛试题涉及的知识点涵盖了数据结构、算法设计、编程语言的使用以及计算机科学的相关概念。以下是对标题和部分内容中涉及知识点的详细解析: 1. 珠心算测验题目解析 珠心算测验题目要求选手对一个正...

    微软校园之星大赛复赛-云山市教育局系统

    ASP.NET 2.0 ,VS 2005 开发

    noip2011复赛普及组及提高组试题

    本资料包含了NOIP2011复赛两天的试题以及相应的解题报告,对于参赛者和准备参加此类比赛的同学们来说,是一份宝贵的参考资料。 普及组试题通常注重基础编程概念的理解与应用,如循环、条件判断、数组等,适合初学者...

    2014 noip 真题 普通组提高组及复赛含答案 含答案更正

    2014年的NOIP比赛包含了普通组、提高组以及复赛等多个层次的竞赛,为不同水平的参赛者提供了丰富的挑战。本资料集合包含了当年比赛的真题,并附带了答案,对于想要了解或复习2014年NOIP题目的学习者来说,无疑是一份...

Global site tag (gtag.js) - Google Analytics