我曾经自己想过每考试一次就从考试题中找找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 简单的最近公共祖先 解题报告的更多相关文章

  1. cogs——2478. [HZOI 2016]简单的最近公共祖先

    2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题 ...

  2. cogs 2478. [HZOI 2016]简单的最近公共祖先

    2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题 ...

  3. COGS——T 2478. [HZOI 2016]简单的最近公共祖先

    http://www.cogs.pro/cogs/problem/problem.php?pid=2478 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单 ...

  4. [BZOJ2946][Poi2000]公共串解题报告|后缀自动机

    鉴于SAM要简洁一些...于是又写了一遍这题... 不过很好呢又学到了一些新的东西... 这里是用SA做这道题的方法 首先还是和两个字符串的一样,为第一个字符串建SAM 然后每一个字符串再在这个SAM ...

  5. [BZOJ2946] [Poi2000]公共串解题报告|后缀数组

    给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 单词个数<=5,每个单词长度<=2000     尽管最近在学的是SAM...但是看到这个题还是忍不住想写SA... (其实是不 ...

  6. 【剑指Offer】52. 两个链表的第一个公共节点 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 方法一:栈 方法二:HashSet 方法三:不使用额外空间 日期 ...

  7. 洛谷 P4112 [HEOI2015]最短不公共子串 解题报告

    P4112 [HEOI2015]最短不公共子串 题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的"子串"指的是它的连续的一段,例如bcd是 ...

  8. [codevs3160]最长公共子串解题报告|后缀自动机

    给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 样例就觉得不能更眼熟啊...好像之前用后缀数组做过一次 然后发现后缀自动机真的好好写啊...(当然当时学后缀数组的时候也这么认为... 这 ...

  9. 8.3考试总结(NOIP模拟19)[最长不下降子序列·完全背包问题·最近公共祖先]

    一定要保护自己的梦想,即使牺牲一切. 前言 把人给考没了... 看出来 T1 是一个周期性的东西了,先是打了一个暴力,想着打完 T2 T3 暴力就回来打.. 然后,就看着 T2 上头了,后来发现是看错 ...

随机推荐

  1. Placeholdem文本域占位符符号标识JavaScript插件

    Placeholdem是文本域占位符符号标识的一个JavaScript插件.占位符的值将逐步删除焦点文字,并在焦点离开逐步恢复. 在线demo:http://placeholdem.jackrugil ...

  2. jQuery WIN 7透明弹出层效果

    jQuery WIN 7透明弹出层效果,点击可以弹出一个透明层的jquery特效,插件可以调弹出框的宽度和高度,很不错的一个弹出层插件. 适用浏览器:IE8.360.FireFox.Chrome.Sa ...

  3. Struct是干什么的

    对于结构(Struct)这一看起来比较特殊的东西(用的比较少,只好用东西来形容了),真心用得少,只有在被问起的时候,才会想起,看看它到底是什么吧. 先给一个链接:http://www.cnblogs. ...

  4. python学习第三天第一部分

    字典 1.字典的定义和规则: 定义:{key1:value1,key2:value2} key 的定义规则:1.必须是不可变的(数字.字符串.元组):2.必须是唯一的, value的定义规则:任意类型 ...

  5. Zendframework 模块加载事件触发顺序。

    模块加载时事件触发的时间顺序: 0.loadModules(ModuleEvent::EVENT_LOAD_MODULES) 1.  loadModule.resolve(ModuleEvent::E ...

  6. 10、WPF程序集

    WPF核心程序集 PresentationCore.dll:这个程序集定义了许多构成WPF GUI层基础的类型.例如包含WPF Ink API(pc笔针输入,手写输入)的支持.几个动画基元以及几个图形 ...

  7. Java中构造函数执行顺序的问题

    1,  先执行内部静态对象的构造函数,如果有多个按定义的先后顺序执行:而且静态类的构造函数只会被执行一次,只在其第一个对象创建时调用,即便是创建了同一个类的多个对象,例如main()函数里b1,b2创 ...

  8. Yii2 composer更新后报错: Calling unknown method: yii\web\UrlManager::addRules()

    网上搜了好多答案,基本上都是让你在composer.json里面添加这样一段话: "extra": { "asset-installer-paths": { & ...

  9. internet协议

    internet协议入门 前言 劳于读书,逸于作文. 原文地址:internet协议入门 博主博客地址:Damonare的个人博客 博主之前写过一篇博客:网络协议分析,在这篇博客里通过抓包,具体的分析 ...

  10. notifyDataSetChanged listview内容没更新的问题

    如红色部分所示,需在Adapter添加setData方法,当 listData中数据更改后,调用setData,为Adapter设置新的数据,此时调用notifyDataSetChanged() 就可 ...