模板题P3690

基础题P3203[HNOI2010]弹飞绵羊

\(access\)是搞出一条端点为\(x,y\)的路径 , 且维护的是实子树的信息 . 由于题目比较简单 , \(access\)时还不需要更改其它信息

[NOI2014]魔法森林

每条边有两个权值\(x_i,y_i\) , 在图上求一条 1 到 n 的路径 , 使得\(max\{x_i\}+max\{y_i\}\)最小 .

以\(y\)这一维排序依次加边 , 用\(LCT\)维护一条路径上\(x\)这一维的最大值 . 如果形成环而且当前插入的这条边小于环上最大值 , 就把环上最大值的那条边\(cut\) .
这样答案就是当前的\(y_i\)加上\(LCT\)中路径上最大的\(x_i\)

[BJOI2014]大融合

求经过一条边的路径数(即统计子树大小)

维护虚子树信息即可 , \(pushup\)时有\(size[x]=size[ls]+size[rs]+vsize[x]+1;\)

[WC2006]水管局长

询问两点之间最短距离 , 一些水管可能会坏掉 .

倒过来 , 把删边变成加边 , 如果新处理的边小于\(LCT\)中的最大值就加入并把最大值断开 .
所以要维护最大边的编号 , 才能够删除
这里体现\(LCT\)无法处理边的信息 , 所以把边变成一个点连接两个端点

[UOJ207]共价大爷游长沙

询问集合中的路径是否都经过某一条边

一条\(x\)到\(y\)路径被所有路径经过,当前仅当以\(x\)为根时,所有路径的端点都恰好有一个在\(y\)的子树中
可以对每条路径随机一个权值 , 路径两个端点异或这个权值 , \(LCT\)维护子树异或和 , 询问的时候\(split(x,y)\)判断\(sum[x]\)和\(tot\)是否相等即可
\(LCT\)基本操作都在这里了

[SHOI2014]三叉神经树 (直接把博客复制了过来) , 这种题还是放一下代码

题意 : 每个点有三个儿子 , 给定叶节点的权值\(0\)或\(1\)且支持修改 , 非叶子节点的权值为当有\(>=2\)个儿子的权值为\(1\)的时候取\(1\) , 每次修改后求根节点输出
定义 : 权值可以取\(0,1,2,3\) ; 输出为\(0\)或\(1\)且权值\(>=2\)时输出为\(1\) .
限制 : 修改的都是叶子节点

考虑如果把输出\(0\)改成\(1\) , 则找到祖先中最深的权值不为\(1\)的点 , 这条链上的输出会改变 , 这里用\(LCT\)维护
如果把输出\(1\)改成\(0\) , 则找到祖先中最深的权值不为 \(2\) 的点 , 这条链上的输出会改变为\(0\)

这样有点麻烦 , 来一个转化 , 叶节点权值取值范围由\(0,1\)变为\(1,2\) ; 统一变成了权值\(2\)会对父亲产生贡献 , 权值\(1\)对父亲没有贡献

定义\(not1[x]=true\)的意义是\(x\)的子树中存在 权值不为\(1\)的点 , \(not2[]\)类似 .
只要写了\(pushdown\) , \(LCT\)也能区间打标记 .

打标记时先潦草地搞一下有类似\(not2[x]=not1[x],not1[x]=0\)的操作 , 之后在\(pushup\)的时候会有简单而正确的更新 : \(not1[x]=not1[ls]\ |\ not1[rs]\ |\ (val[x]!=1);\)
一定要想清楚所有状况才能说明这是对的 : 如果把\(0\)改成\(1\) , 可能碰到一个权值为\(0\)的点变成\(1\) , 或者\(2\)变成\(3\)而停止 ;
如果把\(1\)变成\(0\) , 可能碰到一个权值为\(1\)的点变成\(0\) , 或者\(3\)变成\(2\)而停止 .

所以\(pushup\)在\(LCT\)中很重要 , 在各种数据结构中都很重要 ,
而难点就在怎么维护其他信息使得定义的\(pushup\)是对的 . 尽管在一般线段树题目中看不出来 ,
但在复杂一点的比如P4198楼房重建[HNOI/AHOI2018]转盘便显得非常重要了 .
类似地 , [NOIP2018]保卫王国中从下往上转移使得矩阵乘的更新顺序改变 , 说明\(pushup\)操作真的非常重要.
最简单的操作却能更新很难更新的情况,从而维护正确性

这道题还用到了一个点 , \(access\)可以使无关的点断开 , 而不直接\(fa[x]=0,ch[y][\_]=0\)是因为\(access\)包括了\(pushup\)的更新
两个端点找出来以后就可以用上面说的修改和打标记了

终于可以体会\(503\)巨佬的话了 , 好后悔之前什么都没写 , 到现在什么都看不懂 \(\dots\) 补坑真的不爽

[ZJOI2016]大森林 , 这是一道必须看代码才能很好领会的题

题意 : 有\(n\)棵树 , 每棵树有一个生长节点 .
操作\(1\) : \([l,r]\)的树在生长节点上长出一个节点(长出的节点标号都相同)
操作\(2\) : \([l,r]\)的树的生长节点改为\(x\)
操作\(3\) : 询问第\(x\)棵树上\(u,v\)的距离

对于每个\(1\)操作建一个虚点,以后的\(0\)操作都连在最近建好的虚点上。这样每次整体嫁接的时候,直接把这个虚点断掉它原来的父亲,再\(link\)过去就可以了
求在\(x\)位置的两点之间距离 , 只要之前的换点加点操作完成 , 就可以计算 , 而且也要马上计算 , 之后树的形态就又要变了 , 这样保证了复杂度

关于代码 : 先按思路把离线的事件处理出来
然后发现这种离线的利用虚点的转移只能用\(LCT\)维护
注意 : 只有实点才算\(size\) , 并统计到路径长度中去 , 利用的虚点不算\(size\)
还有\(LCT\)上不\(makeroot\)时求\(LCA\)的求法

[ZJOI2018]历史 , 具体细节见代码

题意 : 给出一棵树,给定每一个点的 \(access\) 次数,计算轻重链切换次数的最大值,带修改.

先考虑不带修改怎么做
假设 \(u\) 的子树发生了两次 \(access\) , 那么当且仅当这两次 \(access\) 的点来自 \(u\) 的两个不同的儿子的子树 , 答案才会 \(+1\)
要使得答案最大 , 就是尽量让所有相邻发生的 \(access\) 都来自不同子树
把同类型的数挪到一边就是当 \(2\times h\ge t+1\) 时,答案是 \(2(t-h)\) ,否则是 \(t-1\)

考虑待修改怎么做
令$ f_i$表示 \(i\) 的子树 \(access\) 的总次数,如果 \(2f_i\ge f_{fa_i}+1\) 那么连实边 \((i,fa_i)\) 其他的都是虚边
如果把\(i\)子树中的点\(j\)权值加上\(w\) , 则只会影响\(j\)到根节点路径的答案和虚实边关系 ,
因为 \(2(f_i+w)\ge(f_{fa_i}+w)+1\)所以实边还是实边 , 并且答案不会变化
所以我们只需要找到路径上的虚边进行(暴力)修改就好了 , 然后 \(ans+=\) 这个点更新后的答案 \(-\)更新前的答案

这题难在构造实儿子(边)和虚儿子(边) , 注意到虚边只有\(log\)条 , 所以如果转化为
只需要修改虚儿子(边)的信息 , 剩下的通过\(splay\)或者其他一些操作完成就接近正解了

本题中有一个贪心 , 就是子树中\(size>=\)自己的一半的点的贡献的重要性 , 这个点再大也无法影响答案了 , 转化为实儿子(边)对当前点的答案无影响 , 其他的就都定义为轻边
修改是就是\(splay+\)暴力中的分类讨论
注意 : 对于\(rs\)变为虚儿子和\(y\)变为实儿子的判断都要考虑清楚

还有一个特别容易忽视的点 : 为了使崛起过程中战争次数最多 , 尽量要让所有相邻发生的\(access\)都来自不同的子树 , 于是统计\(maxp\)必须考虑\(u\)这个点 , 否则只有\(70\)分
可见复杂的题目一定要对每个子问题都分类清楚 , 特别是 端点 , 边界 , 根节点 , 叶节点 这些地方一般都要特判
否则甚至可能做不出 , 比如[HDU4035]Maze[HDU4089]Activation

难题就是简单题的叠加 , \(ZJOI\)的题真神仙毒瘤

[NOIP2018]保卫王国 , 具体细节见代码

这题用\(LCT\)比树剖好码多了\(\dots\)

这一题中可以用\(LCT\)维护虚子树信息 , 即轻儿子信息 ;
\(DP\)方程可以写为从下往上递推的 , 写起来很方便 , 用\(LCT\)维护起来也只是把矩阵乘的顺序交换一下
可见LCT可应用的范围之广

LCT小小结的更多相关文章

  1. CreateCompatibleDC 与 CreateCompatibleBitmap 小小结

    通常使用CreateCompatibleBitmap时候都会用到CreateCompatibleDC.而是用CreateCompatibleDC的目的不是为CreateCompatibleBitmap ...

  2. JVM内存模型 小小结

    可以看一下我的另一篇总结 JVM运行时数据区与JVM堆内存模型小结 推荐一篇文章,尚学堂的 Java内存模型深度解读 . 不方便全文转载,就摘录下吧. 以往的认知都是以基本类型.引用类型.常量.方法等 ...

  3. java基础知识小小结

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  4. DP小小结

    入门题 : [Luogu1441]砝码称重 , [NOIP2015]子串 [AHOI2009]中国象棋 , 详见代码 [HNOI2007]梦幻岛宝珠 , 详见代码 [NOIP2012]开车旅行 , 没 ...

  5. 数位DP之小小结

    资料链接:http://wenku.baidu.com/view/9de41d51168884868662d623.html http://wenku.baidu.com/view/d2414ffe0 ...

  6. 扩展 jquery miniui 组件实现自动查询数据

    主题 之前写过一篇文章分享了公司basecode查找数据后台是怎么实现的(http://www.cnblogs.com/abcwt112/p/6085335.html).今天想分享一下公司前台是怎么扩 ...

  7. 【工作代码】复杂 JSON 值替换处理

    总结下最近的工作遇到的点:入参复杂 JSON 层层嵌套,Java 怎么优雅的处理. 一.关于 JSON JSON 是类似 XML 用于存储和交互文本信息.但优于 XML ,其更小,更快,更易懂和解析. ...

  8. JRE和JDK

    转自:http://www.cnblogs.com/myitm/archive/2011/05/03/2035942.html   很多程序员已经干了一段时间java了依然不明白jdk与jre的区别. ...

  9. jdk、jre、jvm的关系

    JDK里面的工具也是用JAVA编写的,它们本身运行的时候也需要一套JRE,如C:\Program Files\Java\jdk1.5.x\目录下的JRE.而C:\Program Files\Java\ ...

随机推荐

  1. 配置springboot在访问404时自定义返回结果以及统一异常处理

    在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息. 如下是springBoot自带的错误结果信息: ...

  2. Android模拟器出现emulator-5554 disconnected! Cancelling activity launch !的解决办法

    关于 emulator-5554 disconnected! Cancelling 'xxx activity launch'!的问题,解决方法: d: cd D:/Program Files/and ...

  3. spring 框架jdbc连接数据库

    user=LF password=LF url=jdbc:oracle:thin:@localhost:1521:orcl driver=oracle.jdbc.driver.OracleDriver ...

  4. Ubuntu16.04 ARM 编译 编译器版本和unordered_map map问题

    源文件内使用unordered_map时候,例如如下demo #include <unordered_map> void foo(const std::unordered_map<i ...

  5. js精度(摘)

    Math.formatFloat = function (f, digit) {    var m = Math.pow(10, digit);    return parseInt(f * m, 1 ...

  6. unbutu下wireshark编译安装(已更新)

    今天下午在ubuntu下进行编译安装wireshark,过程中出了很多错误,但最终安装成功了,这里写下自己的安装步骤和方法,有参考博文的安装编译方法,也有自己的总结和心得. 1 安装编译工具 $sud ...

  7. MVC下的cshtml和aspx页面

    MVC中的aspx页面是System.Web.Mvc.ViewPage类的实例. 表示将视图呈现为 Web 窗体页所需的属性和方法. 继承层次结构 System.Object System.Web.U ...

  8. Capturing ASP.NET Application Startup Exceptions

    It has become common practice to perform tasks during an ASP.NET applications start up process. Thes ...

  9. javascript总结4:javascript常见变量

    1 javascript变量 定义:变量在计算机中,是用于存储信息的"容器". 2  使用方法: 2-1 定义变量: var n1; 2-2 变量赋值: var n2=23.45; ...

  10. Java 集合工具类---------- Collections类