正题 题目链接:https://www.luogu.com.cn/problem/CF1137F 题目大意 给出\(n\)个点的一棵树,第\(i\)个点权值为\(i\). 一棵树的删除序列定义为每次删除编号最小的叶子并将其加入序列末尾. 要求支持 修改一个点的权值为一个比目前所有权值都要大的一个值 询问一个点在删除序列的位置 询问两个点在删除序列的先后顺序 \(1\leq n,q\leq 2\times 10^5\) 解题思路 假设我们已经确定的先后顺序,目前最大的权值为\(y\)号点,然后修改…
题目 CF1137F 很有意思的题目 做法 直接考虑带修改的做法,上一次最大值为u,这次修改v,则最大值为v了 我们发现:\(u-v\)这条链会留到最后,序列里的其他元素相对位置不变,这条链会\(u\longrightarrow v\)排到最后 序列会分成很多块,而这些块是以链为基础的 可以用\(LCT\)来做,具体说一下: 最大值放到根,修改v,就把\(v\)换成根,这个时候会拉一条链\(u-v\),此时\(u\)在\(v\)的右子树,\(x\)在单个块中的排序,就是\(LCT\)里单个\(s…
题面 我们定义一棵树的删除序列为:每一次将树中编号最小的叶子删掉,将该节点编号加入到当前序列的最末端,最后只剩下一个节点时将该节点的编号加入到结尾. 例如对于上图中的树,它的删除序列为:2 4 3 1 5 现在给出一棵\(n\)个节点的树,有\(m\)次操作: \(up\) \(v\):将\(v\)号节点的编号变为当前所有节点编号的\(\max + 1\) \(when\) \(v\):查询\(v\)在当前树的删除序列中是第几号元素 \(compare\) \(u\) \(v\):查询\(u\)…
孔爷的杂题系列:LCT清新题/ODT模板题 题目大意 定义一颗无根树的燃烧序列为:每次选取编号最小的叶子节点形成的序列. 要求支持操作:查询一个点$u$在燃烧序列中的排名:将一个点的编号变成最大 $n \le 200000$ 题目分析 首先初始的燃烧序列容易构造,那么考虑进行一次up操作对序列会产生什么影响. 这里对$3$进行一次$up$,得到下图. 容易发现,记上一个版本序列最后一个元素为$las$,进行$up\,\,\,x$相当于是把路径$(las,x)$的答案变成从$las$到$x$的等差…
我们定义一棵树的删除序列为:每一次将树中编号最小的叶子删掉,将该节点编号加入到当前序列的最末端,最后只剩下一个节点时将该节点的编号加入到结尾.现在给出一棵n个节点的树,有m次操作: up v:将v号节点的编号变为当前所有节点编号的\(max + 1\) when v:查询v在当前树的删除序列中是第几号元素 compare u v:查询u和v在当前树的删除序列中谁更靠前 题解 考虑每个点up后会带来什么影响. 可以发现新修改的这个点和修改这个点之前编号最大的点之间的这条链是最后被删掉的. 而且删除…
显然compare操作可以通过两次when操作实现,以下仅考虑前两种操作 为了方便,将优先级最高的节点作为根,显然根最后才会被删除 接下来,不断找到剩下的节点中(包括根)优先级最高的节点,将其到其所在树根的所有节点从下到上依次加入到序列的开头并删除,不难发现最终得到的序列即为燃烧的顺序 将每一次删除的链上的边称为实边,其余边称为虚边,实际上就构成了一个类似于LCT的结构 一次$v$的修改操作对该LCT的影响,简单分析后不难发现即为将$v$换为根 考虑节点$v$的答案,即分为两部分: 1.定义其中…
Codeforces 题面传送门 & 洛谷题面传送门 考虑将一个点 \(x\) 的编号变为当前所有点编号最大值 \(+1\) 会对每个点的删除时间产生怎么样的影响.由于编号最大的点肯定是最后一个被删除的,因此我们不妨令编号最大的点为根,那么可以发现,对于不在 \(x\) 到根这条路径上的点,它们删除的相对位置顺序是不会发生变化的,因为删除这样的点时,肯定它们的儿子已经被删除了,而它的父亲肯定没被删除,因此 \(x\) 到根节点这条路径上的点的删除顺序肯定不影响其它点的删除顺序,而由于此时 \(x…
题目链接: [Codeforces1137F]Matches Are Not a Child's Play 题目大意: 我们定义一棵树的删除序列为:每一次将树中编号最小的叶子删掉,将该节点编号加入到当前序列的最末端,最后只剩下一个节点时将该节点的编号加入到结尾. 例如对于上图中的树,它的删除序列为:$2\ 4\ 3\ 1\ 5$ 现在给出一棵$n$个节点的树,有$m$次操作: $up\ v$:将$v$号节点的编号变为当前所有节点编号的$max+1$ $when\ v$:查询$v$在当前树的删除序…
[CF438E]The Child and Binary Tree(多项式运算,生成函数) 题面 有一个大小为\(n\)的集合\(S\) 问所有点权都在集合中,并且点权之和分别为\([0,m]\)的二叉树的个数. \(n,m<=10^5\) 题解 设\(f(i)\)表示点权和为\(i\)的二叉树个数,\(c(i)\)是集合中数的生成函数,那么我们可以得到 \[f(n)=\sum_{i=1}^{n}c(i)\sum_{j=0}^{n-i}f(j)f(n-i-j)\] 显然有\(f(0)=1\) 构…
Codeforces 很好,通过这题对LCT的理解又深了一层. 思路 (有人说这是套路题,然而我没有见过/kk) 首先发现,删点可以从根那里往下删,非常难受,所以把权值最大的点提为根. 然后考虑\(x\)什么时候会比\(y\)先被删掉:当且仅当\(x\)子树内权值最大值比\(y\)子树内权值最大值更大,而且\(x\)不是\(y\)的祖先. 所以给每一个点记另外一个权值:子树内最大值. 那么修改的时候会发生什么呢?要把另外一个点提为根,并且新根和旧根之间的那条链的子树最大值全都要改成原来的最大值.…