【UR #7】水题走四方 题解
链接: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】水题走四方 题解的更多相关文章
- 【UR #7】水题走四方
题目描述 今天是世界水日,著名的水题资源专家蝈蝈大臣发起了水题走四方活动,向全世界发放成千上万的水题. 蝈蝈大臣是家里蹲大学的教授,当然不愿意出门发水题啦!所以他委托他的助手欧姆来发. 助手欧姆最近做 ...
- 【省选水题集Day1】一起来AK水题吧! 题解(更新到B)
题目:http://www.cnblogs.com/ljc20020730/p/6937936.html 水题A:[AHOI2001]质数和分解 安徽省选OI原题!简单Dp. 一看就是完全背包求方案数 ...
- 【UOJ#82】【UR #7】水题生成器(贪心)
[UOJ#82][UR #7]水题生成器(贪心) 题面 UOJ 题解 把\(n!\)的所有约数搜出来,这个个数不会很多. 然后从大往小能选则选就好了. #include<iostream> ...
- World Finals 2017 (水题题解)
看大佬做2017-WF,我这种菜鸡,只能刷刷水题,勉强维持生活. 赛后补补水题. 题目pdf链接,中文的,tls翻译的,链接在这里 个人喜欢在vjudge上面刷题. E Need for Speed ...
- #82. 【UR #7】水题生成器
链接:http://uoj.ac/problem/82 今天是世界水日,著名的水题资源专家蝈蝈大臣向世界宣布了他的一项新发明 —— 水题生成器. 每道题目都有一个正整数的难度值.水题生成器虽然强大但是 ...
- PAT甲题题解-1011. World Cup Betting (20)-误导人的水题。。。
题目不严谨啊啊啊啊式子算出来结果是37.975样例输出的是37.98我以为是四舍五入的啊啊啊,所以最后输出的是sum+0.005结果告诉我全部错误啊结果直接保留两位小数就可以了啊啊啊啊 水题也不要这么 ...
- PAT甲题题解-1012. The Best Rank (25)-排序水题
排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...
- PAT甲题题解-1019. General Palindromic Number (20)-又是水题一枚
n转化为b进制的格式,问你该格式是否为回文数字(即正着写和倒着写一样)输出Yes或者No并且输出该格式又是水题... #include <iostream> #include <cs ...
- PAT甲题题解-1041. Be Unique (20)-水题
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789189.html特别不喜欢那些随便转载别人的原创文章又不给 ...
随机推荐
- 模拟QQ窗口抖动效果(通过MoveWindow和Sleep进行模拟)
RECT rtWindow; GetWindowRect(&rtWindow); //long x = 400; //long y = 200; long x = rtWindow.left; ...
- HBuilder打包App流程记录
摘要:基于HBuilder建立一个简单的移动app项目,并打包成apk,使用这套平台用H5开发真正的移动项目,相当于省去了原生部分的人力和工作配合,性能的话,后续我会基于这套技术开发相关的应用来验证, ...
- SqlServer 无法为可更新的订阅设置发布服务器登录名 sp_link_publication
原文:SqlServer 无法为可更新的订阅设置发布服务器登录名 sp_link_publication 没有截图: 创建可更新订阅,正常创建了发布,在订阅端创建订阅,最后一步提示完成,却出现了警告: ...
- 编译时MSIL注入--实践Mono Cecil(1)
原文:编译时MSIL注入--实践Mono Cecil(1) 紧接上两篇浅谈.NET编译时注入(C#-->IL)和浅谈VS编译自定义编译任务—MSBuild Task(csproject),在第一 ...
- JavaScript生成树形菜单(递归算法)
1.最终效果图(这里仅为实现算法,并加载至页面,不做任何css界面优化) 注释:本示例包含三级目录菜单,但实际上可支持N级(可使用该代码自行测试) 2.数据源 菜单信息一般来源于数据库中数据表,且为自 ...
- Hadoop中一些重要概念简要总结
Hadoop是一个利用大规模计算机集群,可处理大量数据的分布式并行框架. Hadoop 官网 Hadoop的核心设计包括HDFS和MapReduce. HDFS HDFS(Hadoop Distrib ...
- Channel 9视频整理【1】
David Dong 微软mvp https://www.facebook.com/DotNetWalker http://studyhost.blogspot.tw/ https://ch ...
- C++中代理类和句柄类
指针是 C 与其他语言区别的重要特征之一,在 C++ 中,指针也被广泛运用,我们通过指针实现多态.然而,众所周知,指针的使用必须小心,否则很容易造成内存泄漏 Memory Leak.当我们有几个指针指 ...
- U盘免疫
界面如下: 关键部分代码如下: void CImmunityUDlg::OnBnClickedButtonOk() { // TODO: 在此添加控件通知处理程序代码 TCHAR szPath[MAX ...
- JavaScript-DOM续
一.路由的跳转 <body> <a href="#/course">课程</a> <a href="#/main"&g ...