链接:http://uoj.ac/problem/84

  20分算法:萌萌的小爆搜,别搜进环里就行。

  50分:我们考虑一下最优决策是什么样的。看似很显然的一点就是我们先让本体在原地不动,让分身去遍历子树,然后在只剩一个儿子和一个不属于这个儿子的子树的叶子的时候一个去儿子一个去叶子。显然这个叶子应该是最深的那个叶子看起来好像并没有什么毛病,然而我们会发现他会被样例3hack,因为我们可以考虑这种情况:假如有两根很长很长的筷子,我们把用于吃饭的那一头粘起来并作为根结点。那么答案显然是一根筷子的长度。但是如果这两根筷子是劣质一次性筷子,在两根筷子的侧边长了一点点毛刺,这些毛刺比较靠近吃饭的那一端。那么我们明显应该先去遍历“毛刺”再遍历筷子的主干部分。所以我们考虑这么决策:我们假设本体一直不动,分身负责跑路。那么在我们遍历整棵树的过程中主体一定是走走停停,我们设主体停下来去让分身跑路的点为关键点。那么我们可以这么决策,我们到达一个关键点之后我们让分身遍历除了下一个关键点子树内的叶子节点和一个不属于包含这个关键点的儿子的最深的叶子节点以外的所有叶子节点。然后分身和主体一个去叶子一个前往下一个关键点。我们设f[x]为从根节点开始便利除x子树以外所有节点的的最短时间,deep[x]为x的深度(deep[1]=0),sm[x]为x子树内所有叶子节点的深度和,size[x]为x子树内叶子节点的个数。dmx[x][y](x为y的祖先)为x到y的父亲这条路径上往外深处去的最深的叶子节点的深度。那么转移方程为:f[x]=min(f[pa]+sm[pa]-sm[x]-(size[pa]-size[x])*deep[pa]+max(0,deep[x]-dmx[pa][x]))。pa为x的祖先。所以我们就可以n^2DP拿到50分了。sm[pa]-sm[x]-(size[pa]-size[x])*deep[pa]为遍历这些叶子节点比f[pa]要多增加的时间,max(0,deep[x]-dmx[pa][x])为从pa走到x的时间-去最后遍历的那个最深的叶子节点的时间。

  100分:我们仔细观察会发现,当x的父亲fa[x]只有x这一个儿子的时候f[x]也可以由f[fa[x]]+1转移过来,原因显然。再仔细观察一下转移式,会发现他实际就是在枚举从哪里开始往外走最长的叶子,max(0,deep[x]-dmx[pa][x])==0当且仅当deep[x]<=dmx[pa][x],那么我们其实只从dmx[pa][x]>=deep[x]且深度最大的pa转移过来就好了。因此,我们可以维护一个dmx[pa][x]单调递减的栈,每次我们在栈里面二分就可以了。虽说复杂度是nlog sqrt(n)的,(栈内的元素个数据说最多是O(sqrt(n)))级别,但是常数非常优秀,可以跑过一些O(n)的算法。但是如果打的丑一点的话会被卡内存。

  100分(2.0):我们可以利用一种最长链剖分进行弹栈,做到O(n),大概做法就是我们称最深叶子节点最深的儿子为重儿子,显然,当前节点对于重儿子所造成的dmx为当前节点第二深的叶子节点的深度,其余儿子为第一深的叶子节点深度。那么我们可以先dfs重儿子,暴力弹栈,然后再dfs轻儿子,依旧暴力弹栈。我们可以发现这么dp我们每个不在最“重”的那条链上的点一定能找到一个dmx[pa][x]>=deep[x]的点,稍微算一下即可证明合法性和时间复杂度。

nlogn
n

【UR #7】水题走四方 题解的更多相关文章

  1. 【UR #7】水题走四方

    题目描述 今天是世界水日,著名的水题资源专家蝈蝈大臣发起了水题走四方活动,向全世界发放成千上万的水题. 蝈蝈大臣是家里蹲大学的教授,当然不愿意出门发水题啦!所以他委托他的助手欧姆来发. 助手欧姆最近做 ...

  2. 【省选水题集Day1】一起来AK水题吧! 题解(更新到B)

    题目:http://www.cnblogs.com/ljc20020730/p/6937936.html 水题A:[AHOI2001]质数和分解 安徽省选OI原题!简单Dp. 一看就是完全背包求方案数 ...

  3. 【UOJ#82】【UR #7】水题生成器(贪心)

    [UOJ#82][UR #7]水题生成器(贪心) 题面 UOJ 题解 把\(n!\)的所有约数搜出来,这个个数不会很多. 然后从大往小能选则选就好了. #include<iostream> ...

  4. World Finals 2017 (水题题解)

    看大佬做2017-WF,我这种菜鸡,只能刷刷水题,勉强维持生活. 赛后补补水题. 题目pdf链接,中文的,tls翻译的,链接在这里 个人喜欢在vjudge上面刷题. E Need for Speed ...

  5. #82. 【UR #7】水题生成器

    链接:http://uoj.ac/problem/82 今天是世界水日,著名的水题资源专家蝈蝈大臣向世界宣布了他的一项新发明 —— 水题生成器. 每道题目都有一个正整数的难度值.水题生成器虽然强大但是 ...

  6. PAT甲题题解-1011. World Cup Betting (20)-误导人的水题。。。

    题目不严谨啊啊啊啊式子算出来结果是37.975样例输出的是37.98我以为是四舍五入的啊啊啊,所以最后输出的是sum+0.005结果告诉我全部错误啊结果直接保留两位小数就可以了啊啊啊啊 水题也不要这么 ...

  7. PAT甲题题解-1012. The Best Rank (25)-排序水题

    排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...

  8. PAT甲题题解-1019. General Palindromic Number (20)-又是水题一枚

    n转化为b进制的格式,问你该格式是否为回文数字(即正着写和倒着写一样)输出Yes或者No并且输出该格式又是水题... #include <iostream> #include <cs ...

  9. PAT甲题题解-1041. Be Unique (20)-水题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789189.html特别不喜欢那些随便转载别人的原创文章又不给 ...

随机推荐

  1. Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法

    原文:Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法  [函数名称]   高斯平滑滤波器      GaussFilter(WriteableBitmap src,int r ...

  2. Delphi7 时钟(使用了多个自定义组件)

    http://download.csdn.net/detail/akof1314/3073289

  3. jquery模拟按下回车实现代码

    简单地记下jquery实现回车事件,代码如下: 全局: 代码如下: $(function(){ document.onkeydown = function(e){ var ev = document. ...

  4. 深入探索ScrollWindow

    最近做WIN32 API开发时发现对ScrollWindow的一些工作原理并不是太清楚,于是做了相关研究,记载下来和大家共同学习. 首先在WM_CREATE中获取系统字符的宽度和高度 case WM_ ...

  5. Microsoft.Ace.OleDb.12.0 操作excel

    在用c#操作excel的时候,碰到了一下的问题: 1.Microsoft.Ace.OleDb.12.0未安装,可以到下载2007 Office system 驱动程序AccessDatabaseEng ...

  6. Nginx反向代理负载均衡的容器化部署

    首先,在home目录创建microservices目录,开启第一篇章. cd ~ && mkdir microservices && cd microservices ...

  7. 10个有趣的javascript和css库(2019年5月最新)

    我们的使命是让您了解最新和最酷的Web开发趋势.这就是为什么我们每个月都会发布一些精选的资源,这些资源是我们偶然发现并认为值得您关注的. 1.Tessaract.js 强大的javascript(节点 ...

  8. 浅谈jpa、hibernate与spring data jpa三者之间的关系

    1.解释hibernate之前先了解下什么是orm,orm是object relation mapping,即对象关系映射,object可以理解成java实体类Entity,relation是关系型数 ...

  9. SQL Server 2012完全备份、差异备份、事务日志备份和还原操作;

    SQL Server 2012完全备份.差异备份.事务日志备份和还原操作: 1.首先,建立一个测试数据库,TestA:添加一张表,录入二条数据:备份操作这里我就不详细截图和讲解了.相信大家都会备份,我 ...

  10. Java 中无返回值的方法在使用时应该注意的问题

    Java 中的方法是形态多样的.无返回值的方法在使用时应该规避哪些问题呢? 一.不可以打印调用或是赋值调用,只能是单独调用(非常重要): 二.返回值没有,不代表参数就没有: 三.不能return一个具 ...