自闭集训 Day5

树上数据结构

前置知识

  • 点分治
  • 边分治
  • 树链剖分
  • LCT
  • Top Tree

LCT时间复杂度

线段树每次查询是严格\(\log n\)的,然而splay维护连续段的时候,如果每次查询可以缩点,那么访问的区间数是均摊\(O(1)\)的。(??)

所以用splay维护LCT是一个log,而线段树维护就是两个log。

捉迷藏

边分治多好,干什么点分治……

每个点开个堆维护子树最远点、开个堆维护儿子最远点的前二大的值、开个堆维护全局最大值,然后随便搞。

边分治由于每次只需要合并两个子树,所以好写很多。

bzoj2566

每个颜色分别维护。

bzoj3730

每个点树状数组维护距离为\(len\)的点权和,然后暴跳点分树。

为什么可以树状数组?最大\(dep\)小于等于子树大小,而点分治的子树大小之和为\(n\log n\)。

幻想乡战略游戏

见博客。

Ynoi2011 D1T3

回滚莫队+线段树合并,不过可能假了。

每次查询的时候找到点分树上最浅的点,使得它在连通快内,然后把它看做根来做。

然后考虑一个点\(i\),如果\(i\)到根的\(min,max\)都在\([l,r]\)内,那么\(i\)就在连通快内。这是一个类似于二维数点的东西。

然后再带上颜色的限制,就是一个类似于三维数点的东西。

对每一个点都预处理上面的东西,离线一下,就是\(O(n\log^2 n)\)了。

floj307/CF1010F

先考虑\(O(n^2 )​\)做法,发现就是一个很无脑的DP:设\(f_{x,i}​\)表示考虑\(x​\)的子树,搞到\(i​\)大小的连通块的方案数,然后乱搞。用生成函数表示就是\(f_x=x\prod (f_v+1)​\)。

链剖加速,每个轻儿子的大小之和是\(n\log n\),一条一条重链来做。

设\(F_ i( x)\)表示考虑重儿子的生成函数,\(A_i(x)\)表示不考虑重儿子的生成函数。

那么有\(F_i(x)=(F_{i-1}(x)+1)A_i(x)x\) ,分治FFT。

似乎是把式子展开之后就是\(\sum\limits _{i=1}^n \prod\limits_{j=i}^n B_j\),发现可以分治FFT搞起来,就没了。

Ynoi2011 D2T3

可以根号分治,注意修改的时候只会有\(O(\sqrt{n})\)个点旁边有大点,所以可以暴力。

链分治,每个点只维护轻儿子,然后修改的时候就只需要修改重链头的数据结构,于是\(O(n\log^2 n)\)。

每次只维护轻儿子应该是个套路。

UOJ191

把操作树建出来,加点就是往儿子走,删点就是跳父亲,查询就是询问某条链上的最大值。

答案显然是在上凸壳上,现在问题是如何维护凸壳。

最naive的方法是树链剖分,然后每条重链用线段树维护凸壳,这样是\(O(n\log^3 n)\) 的。注意横坐标没有单调性,需要用平衡树维护。

发现跳重链有一个性质:只要当前重链不是最后一条,那么要查询的点必然是一个前缀。

既然是前缀那么就可以离线,然后每条重链上面分别做,可以一个\(\log\)。

所以最后总复杂度就是\(O(n\log^2 n)\)。

某题

两个操作:修改点权、求最大权值连通块。

就是个动态DP,直接搞。

LCT

由于LCT的access是均摊的,所以不能可持久化。

然而有严格单次\(\log n\)的动态树,然而不会。

某题

可以用\(a_i\)的代价选中子树中所有叶子,问把\(x\)子树中的叶子选中的最小代价。

有一个简单的暴力DP:\(f_x=\min(a_x,\sum f_v)\)。

重链剖分,转移方程变为\(f_i=\min(a_i,f_{i+1}+b_i)\)。

把这个看做是一个变换\((a,b)\)表示\(x\rightarrow \min(a,x+b)\),然后发现这个变换可以合并:
\[
\min(c,\min(a,x+b)+d)=\min(\min(c,a+d),x+b+d)
\]
而且显然还支持结合律,所以可以线段树维护。套上树链剖分之后就\(O(n\log^2 n)\) 了。

如果用LCT维护,那么由于有reverse操作的存在,要额外记录反过来变换的值,稍微难写一点,但复杂度是\(O(n\log n)\)。

某题

设\(dp_{i,x}\)表示到了\(i\)的时候值为\(x\),胜者是谁,然后从右往左DP,发现每次只会改一个位置的值,于是获得了\(O(qn)\)的做法。这个做法不怎么能优化……

发现一个性质:每次游戏只会有最多一个人动手,并且动手之后必然会搞成自己的编号。

所以前\(i\)个人只会搞出小于等于\(i\)的数。

然后连边:\(i\)朝\((i-a_i)\% n\)连边。如果\((i-a_i)\% n\ge i\)那么不用连。

这样形成了一个森林。

那么考虑一个DP:设\(dp_{x}\)表示如果走到了\(fa_x\)那么\(x\)会不会改。如果儿子里有一个是1那么自己就是0,否则就是1。

最后考虑0,如果\(dp_0=1\)那么0赢了,否则就是0的儿子里面是1的编号最小的点赢了。

考虑修改操作,发现就是个动态DP,用LCT维护。

CodeChef Pushflow

最大流就是最小割,最小割要么切树边要么切两条环边。

如果切环边,那么肯定要切最小值,所以可以直接把最小值丢掉,加到其他边上。

也可以用圆方树直接搞,我可能白学了圆方树……

WineDAG's prevention

一个树,增加点的点权、翻转一条路径上的权值、询问路径最大值、最小值。

正常LCT是做不了的,因为LCT内的splay是按深度为权值的。

这题可以维护两棵splay,一个是形态splay,另一个是权值splay,用中序遍历的序列来一一对应。

于是修改就可以直接在权值splay上面翻转而不改变树形态,于是做完了。

CF1137F

根本不会 /kk

什么时候\(x\)在\(y\)之前被删除?令权值最大的点为根,当且仅当\(x\)不是\(y\)的祖先,并且\(x\)的子树最大值不超过\(y\)的子树最大值。

每个点记录每个儿子到父亲节点的权值。

那么一次up操作会发生什么?相当于一次换根+链覆盖。链覆盖可以看成是LCT的access操作。

于是对于LCT里面每一棵splay,维护它的权值在全局的rank,然后查询的时候就先看这个点所在的splay的rank,再加上自己在splay中的位置。

某题

给三个点集\(A,B,C\),满足\(AB,BC\)都构成一棵树,\(A\)内部没有连边。

问随机\(i,j\)把\(B\)中编号小于等于\(i\)的、\(C\)中编号小于等于\(j\)的点删掉,\(A\)仍然连通的概率。

从大到小枚举\(i\),看最大的\(j\)使得仍然连通。显然有单调性,于是可以two pointers。

怎么判断呢?

假设枚举了\(i\)之后把\(C\)中的点挨个删掉,求最晚的连通的时刻。考虑连通性是由某棵生成树撑起来的,所以我们只需要维护删除时刻的最大生成树。

那么从后往前枚举\(i\)的时候会不断地加一些不会被删除的边,即权值为\(\infty\)的边,然后LCT乱搞即可。

2019暑期金华集训 Day5 树上数据结构的更多相关文章

  1. 2019暑期金华集训 Day5 生成函数

    自闭集训 Day5 生成函数 一般生成函数 无脑地把序列变成多项式: \[ \{a_i\}\rightarrow A(x)=\sum_{n} a_nx^n \] 形式幂级数 生成函数是一种形式幂级数. ...

  2. 2019暑期金华集训 Day1 数据结构

    自闭集训 Day1 数据结构 CF643G 用类似于下面的方法,搬到线段树上. 如何合并两个集合?先全部放在一起,每次删掉最小的\(cnt_i\),然后把其他所有的\(cnt\)都减去\(cnt_i\ ...

  3. 2019暑期金华集训 Day6 计算几何

    自闭集训 Day6 计算几何 内积 内积不等式: \[ (A,B)^2\le (A,A)(B,B) \] 其中\((A,B)\)表示\(A\cdot B\). (好像是废话?) 叉积 \[ A\tim ...

  4. 2019暑期金华集训 Day7 分治

    自闭集训 Day7 分治 主定理 由于我沉迷调题,这个地方没听课. 某些不等式 咕了 nth_element 使用快速排序的思想,选一个中间点,看左右有多少个. 期望复杂度\(O(n)\). 首先把一 ...

  5. 2019暑期金华集训 Day7 动态规划

    自闭集训 Day7 动态规划 LOJ6395 首先发现这个树的形态没啥用,只需要保证度数之和是\(2n-2\)且度数大于0即可. 然后设\(dp_{i,j}\)表示前\(i\)个点用了\(j\)个度数 ...

  6. 2019暑期金华集训 Day3 字符串

    自闭集训 Day3 字符串 SAM 考虑后缀树. SAM的parent树是反串的后缀树,所以后面加一个字符的时候相当于往串前面加一个字符,恰好多出了一个后缀. 于是可以以此来理解SAM. 每一条路径对 ...

  7. 2019暑期金华集训 Day3 图论

    自闭集训 Day3 图论 NOI2019 D2T1 没有真正建出图来的必要,可以直接打取\(\min\)的\(tag\). 也可以把边压进堆里,然后变成一个二维清点问题(???),然后就线段树+并查集 ...

  8. 2019暑期金华集训 Day6 杂题选讲

    自闭集训 Day6 杂题选讲 CF round 469 E 发现一个数不可能取两次,因为1,1不如1,2. 发现不可能选一个数的正负,因为1,-1不如1,-2. hihoCoder挑战赛29 D 设\ ...

  9. 2019暑期金华集训 Day2 线性代数

    自闭集训 Day2 线性代数 高斯消元 做实数时,需要找绝对值最大的作为主元,以获取更高精度. 在欧几里得环(简单例子是模合数)意义下也是对的.比如模合数意义下可以使用辗转相除法消元. 欧几里得环:对 ...

随机推荐

  1. java之结合代码理解synchronized关键字

    为了保证数据的一致性即实现线程的安全性,java虚拟机提供了同步和锁机制.synchronized关键字是最基本的互斥同步手段.除此之外,还可以使用java.util.concurrent包中的重入锁 ...

  2. NetworkStream的使用(TcpClient,TcpListener)

    1.在tcp连接中,Networkstream可以重复读取,重复写入,不用关掉连接. 2.关掉NetworkStream会自动关闭掉Tcp连接 3.NetworkStream不需要使用Flush方法, ...

  3. C#精粹--协变和逆变

    概念 协变和逆变来源于类型和类型之间的绑定,C#4.0开始在泛型的接口和委托上支持协变和逆变,不过在这个版本之前的委托也是支持协变和逆变的.比如数组就支持协变,但是这不是一个好的特性,这C#初期版本从 ...

  4. Linux系统内核正式进入5.0版本时代

    知名Linux内核开发人员兼维护人员Greg Kroah-Hartman今天宣布,Linux Kernel 4.20内核分支已经结束并督促用户尽快升级至更新的内核分支. Linux Kernel 4. ...

  5. 命令行获取docker远程仓库镜像列表

    命令行获取docker远程仓库镜像列表 获取思路 通过curl获取镜像tag的json串,解析后得到${image}:${tag}的格式 curl获取示例 # curl [:-s] ${API}/${ ...

  6. ios手机app消息推送

    h5+app项目,推送平台 " 个推 " 首先在manifest.json配置文件中点击模块权限配置,勾选push消息推送配置如图1-1 第二部在manifest.json配置文件 ...

  7. 使用python库relate搭建LMS学习管理系统

    Relate is an Environment for Learning And TEaching Relate是在 Django上面构建的,可以快速搭建LMS系统,该系统可以方便学习管理和在线课程 ...

  8. 【MySQL】SQL语句基础

    一.操作数据库 1.1 创建数据库 1.2 查看数据库 1.3 修改数据库 1.4 删除数据库 1.5 选择数据库 二.操作表 2.1 创建表 2.2 查看表 2.3 修改表 2.4 删除表 三.操作 ...

  9. Centos7安装Openresty和orange

    1.说明 以下全部操作均已root用户执行 2.安装 2.1 安装依赖 yum install readline-devel pcre-devel openssl-devel gcc 2.2 下载op ...

  10. Computer Vision_33_SIFT: A novel point-matching algorithm based on fast sample consensus for image registration——2015

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...