cojs 简单的最近公共祖先 解题报告
我曾经自己想过每考试一次就从考试题中找找idea来出题
这次又找到了一个,先不管原来的考试题是什么
考试题中其中的一部分就是今天的这道题目啦
当时考场上自己比较傻,没有注意到有用的性质,套用了之前黑白树系列的做法
写的是log^2n的,结果导致只能在开O2的情况下A掉这道题目
后来仔细研究了以下,得到了本题的做法
首先我们观察操作中和黑白树系列的那道题目的区别
1、只有染黑操作,没有染白操作
2、不需要可持久化,不需要满足可减性
之后观察题目的性质:
1、转化成暴力写法,每次修改u到根的路径,查询u到根的路径
我们知道修改和查询路径我们可以利用树链剖分+线段树在log^2n的时间内完成
但是仔细考虑性质我们会发现每次修改和查询的一个端点都是根
对于一条链而言,我们每次修改只会修改这条链的顶端top到某个点的值
而又因为只有染黑操作,我们一旦把这条链的顶端top到某个点都染黑之后,这段不可能在被染白回去
那么很明显我们不需要用线段树,可以机智的去掉线段树的那个log
具体做法如下:
我们树链剖分,对于每条链维护一个点u并记录顶端top
每次更新的时候只需要观察更新点的深度是否大于u即可
每次更新是O(1)的,每次最多修改logn条链,修改操作时间复杂度logn
对于查询,我们从u节点向上跳链,如果当前链被修改过,证明答案一定在这条链上
之后我们考虑这条链记录的值u‘的深度,如果大于当前跳到的点u,则答案就是u
否则就是u’
我们每次最多跳logn条链,所以查询时间复杂度logn
至于C操作,时间戳就O(1)啦
总时间复杂度mlogn,常数非常小
在我把考试题的这部分改成这个写法之后就可以在不开O2的情况下A了,而且用时大概是时限的一半
下面说一下有关于出这道题目的一些心得:
1、这个题目的做法我不确定是最优的,可能会有并查集或者O(n)的做法之类的(不过估计需要离线)
如果有更优的做法欢迎与我讨论
2、有关于卡住log^2n:
首先这道题之前的做法是倍增+树状数组,由于维护子树和可以支持染白和可持久化
我一开始调整了树的深度和修改的次数(因为修改是log的,只有查询是log^2的)
使得这个做法会T掉几个点,但是后来我发现由于倍增数组,内存并不兹磁这个做法QAQ
还有一种更显然的做法是树链剖分+线段树,这样修改和查询都是log^2的
这个做法我没有刻意去卡,因为不卡他也会T掉
还有一种做法是上面的优化,就是整条链的修改直接在链上打标记,不维护全局线段树,对于每个链单独开线段树
这样常数会小很多,每次查询的时候只需要跳到第一个有修改标记得链,在线段树上二分就可以了
查询就是log的了,修改还是log^2的
我写了一发,不是很难写,可以过9个点,常数写的比我漂亮一点貌似就能A了
cojs 简单的最近公共祖先 解题报告的更多相关文章
- cogs——2478. [HZOI 2016]简单的最近公共祖先
2478. [HZOI 2016]简单的最近公共祖先 ★☆ 输入文件:easy_LCA.in 输出文件:easy_LCA.out 简单对比时间限制:2 s 内存限制:128 MB [题 ...
- cogs 2478. [HZOI 2016]简单的最近公共祖先
2478. [HZOI 2016]简单的最近公共祖先 ★☆ 输入文件:easy_LCA.in 输出文件:easy_LCA.out 简单对比时间限制:2 s 内存限制:128 MB [题 ...
- COGS——T 2478. [HZOI 2016]简单的最近公共祖先
http://www.cogs.pro/cogs/problem/problem.php?pid=2478 ★☆ 输入文件:easy_LCA.in 输出文件:easy_LCA.out 简单 ...
- [BZOJ2946][Poi2000]公共串解题报告|后缀自动机
鉴于SAM要简洁一些...于是又写了一遍这题... 不过很好呢又学到了一些新的东西... 这里是用SA做这道题的方法 首先还是和两个字符串的一样,为第一个字符串建SAM 然后每一个字符串再在这个SAM ...
- [BZOJ2946] [Poi2000]公共串解题报告|后缀数组
给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 单词个数<=5,每个单词长度<=2000 尽管最近在学的是SAM...但是看到这个题还是忍不住想写SA... (其实是不 ...
- 【剑指Offer】52. 两个链表的第一个公共节点 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 方法一:栈 方法二:HashSet 方法三:不使用额外空间 日期 ...
- 洛谷 P4112 [HEOI2015]最短不公共子串 解题报告
P4112 [HEOI2015]最短不公共子串 题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的"子串"指的是它的连续的一段,例如bcd是 ...
- [codevs3160]最长公共子串解题报告|后缀自动机
给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 样例就觉得不能更眼熟啊...好像之前用后缀数组做过一次 然后发现后缀自动机真的好好写啊...(当然当时学后缀数组的时候也这么认为... 这 ...
- 8.3考试总结(NOIP模拟19)[最长不下降子序列·完全背包问题·最近公共祖先]
一定要保护自己的梦想,即使牺牲一切. 前言 把人给考没了... 看出来 T1 是一个周期性的东西了,先是打了一个暴力,想着打完 T2 T3 暴力就回来打.. 然后,就看着 T2 上头了,后来发现是看错 ...
随机推荐
- no permissions fastboot
no permissions fastboot 获取fastboot文件 1.编译后得android源码会在目录: andsource2/out/host/linux-x86/bin 产生fastb ...
- 打造简单实用的Thinkphp分页样式(Bootstrap版本)
先吐槽一下ThinkPHP3.1版的分页样式,虽然看起来也很简单大方,但是所有的页码全是使用简单的数字,之间的空隙比较小,不大容易点,还有那个“前5页”和“后5页”显得有点多余,因为点击当前显示第一页 ...
- html关于强制显示 隐藏浏览器的滚动条
浏览器的滚动条在一些特殊的展示中,是不需要的,所以必须把它隐藏掉,文章主要介绍一些隐藏或者显示IE的水平或者垂直滚动条的实现代码,需要了解的朋友可以参考下: 相关css代码如下: //强制显示滚动条: ...
- 版权控制之zend guard 6.0使用教程
zend guard6.0使用教程.doc 一.准备工具 1. ZendGuard-6_0_0 下载地址:http://www.zend.com/en/products/guard/downloads ...
- PHP中include和require绝对路径、相对路径问题
在写PHP程序时,经常要用到include或require包含其他文件,但是各文件里包含的文件多了之后,就会产生路径问题. 如下目录: <web>(网站根目录) ├<A>文件夹 ...
- 使用cookie解决微信不能存储localStorage的问题
最近在开发基于微信的Web页面时,发现有些机型不能存储信息到localStorage中,或者是页面一旦关闭,存储的信息也失效了. 于是想到用cookie来替代localStorage,存储一些简单的数 ...
- 反编译APK终结教程
现在来教大家如何由网上下载的Android应用反编译为源码.如果你感兴趣,就来看一看吧.前提是你的电脑得已经配置好了java环境,如果没有配置好的话,下面我会附带一提,如果你还是不懂的话,那就上网搜一 ...
- .NET SDK和下载
http://blogs.msdn.com/b/dotnet/p/dotnet_sdks.aspx .NET SDK和下载 您可以通过下载.NET框架针对包和软件开发工具包,并使用它们与Visual ...
- itertools模块速查
学习itertools模块记住这张表就OK了 参考:http://docs.python.org/2/library/itertools.html#module-itertools Infinite ...
- js执行上下文(由浅入深)
每一个函数都有自己的执行上下文EC(执行环境 execution context),并且每个执行上下文中都有它自己的变量对象VO(Variable object),用于存储执行上下文中的变量 .函数声 ...