模板题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. 中国大学MOOC 设置AutoCAD的绘图环境

  2. PHP配置数据库XML文件

    <?php $doc=new DOMDocument('1.0','utf-8'); //new一个dom对象 $doc->load("config.xml"); 加载 ...

  3. jquery中的cookie使用

    一.检测cookie是否启用 通过navigator.cookieEnabled这个属性实现,若该值为true,则当前cookie是启用的,反之是禁用的,注意:此属性不是一个标准的属性 二.cooki ...

  4. (三)maven出错记录

    此处因为是自己做的所以文笔带过,简单描述下 1\首先是jsp页面报错,缺少必要的servletx依赖jar包,需要在pom中配置 <dependency><groupId>ja ...

  5. Docker01 centos系统安装、centos安装docker、docker安装mongoDB

    1 centos系统安装 本博文是基于 centos6.5 的,利用VMware 虚拟机搭建 centos6.5 系统 1.1 centos6.5资源获取 1.2 安装 1.2.1 新建虚拟机 1.2 ...

  6. 在Sqlserver中使用Try Catch

      创建错误日志表: CREATE TABLE ErrorLog(errNum INT,ErrSev NVARCHAR(1000),ErrState INT,ErrProc NVARCHAR(1000 ...

  7. 238. Product of Array Except Self 由非己元素形成的数组

    [抄题]: Given an array of n integers where n > 1, nums, return an array output such that output[i]  ...

  8. Linux查看操作系统版本的几种方式

    Linux查看操作系统版本的几种方式: 1.uname -a 2.lsb_release -a 3.cat /etc/issue 4.cat /proc/version 5.cat /etc/redh ...

  9. Docker学习笔记_安装和使用nginx

    一.软件环境 1.宿主机OS:Win10 64位 2.虚拟机OS:Ubuntu 18.04,虚拟机IP:192.168.8.25 3.Docker安装在虚拟机Ubuntu 18.04上 二.安装过程 ...

  10. Linux设置串口波特率等参数

    转自 http://blog.csdn.net/zoomdy/article/details/50921336 mingdu.zheng at gmail dot com stty查看串口参数 stt ...