ELCA
这道题的整体思路就是, 对于一个 lct , 我们能够维护的东西, 需要保证能够在较优的时间内完成实边修改和区间合并(就是得保证支持实虚边转化和平衡树的维护), 那么这道题, 如果我们考虑减掉或者减小实儿子会使本点贡献怎么变, 发现改变的是当前点的权值乘以虚儿子的子树点数之和加一再乘以实儿子子树的变化量。 到此, 要维护的也就一目了然了。
The Majestic Brown Tree Snake
关键在于找到关键的点(能否满足主要和这些点), 这道题的关键点就是连着三个长度大于蛇长度的路径的点, 当且仅当蛇头或者蛇尾能够到达这种点, 我们能够输出Yes(明显能到达就能转向, 不能到达我们直接当这个点不存在, 然后如果一棵树一个这样的点都没有, 那么我们首先考虑如果蛇不在这棵树的直径上, 递归证明, 如果在直径上, 那么我们考虑如果它能离开这条直径, 就说明这个直径上某个点连着一条长度大于等于蛇长的非直径链, 那么跟据这是直径, 那么这个点到达直径的两端不能小于这条链的长度, 因为小于了的话, 这就不是直径了, 那么也即是存在关键点了, 不符合不存在关键点的假设, 所以说, 如果不存在关键点, 蛇无法离开), 然后还有一个关键在于关键点之间的关系, 容易发现这个关系就如果到达的了一个关键点, 就可以到达其它所有的关键点(反正有连着三个可以完全装下蛇的链, 要走哪边先全缩到其它方向上, 然后再直接往目标方向跑就行)。 那么我们只要随便找一个点, 然后贪心的去跑, 检查能否到达就、行了。 具体的, 我们将关键点当成根, 不停地将头先跑到当前能到达的最深位置, 然后再将尾跑到当前能到达的最深位置, 如果某个时候头在尾的祖先(或者反过来), 那么可以直接跑到根。贪心证明就省略了。
特别说明:本人以上的所有文字, 好像都把蛇的长度减一直接写成了蛇的长度, 不过意会即可, 不必纠结。
Swap Pass
这道题的思路比较巧妙, 首先我们从样例和翻译出发, 合理推测这道题很可能没有无解, 接着跟据问题是归位所有的 \(ai\) (其实主要应该还是要看到排列)我们再想到将 \(ai\) 连一条到 \(i\) 的边, 我们可以得到一个一个(警觉)的环。 对于一个环, 我们首先试一试直接将一个点归为:
归位前:
直接归位 \(ai = 1\) 后:
我们发现这个图变成了 \(1\) 和另一个环。 同样, 我们再归位 \(6\) 可以发现:
所以, 我们只要每次还原同一个位置上的数, 那么只有一个环的话一定能将所有点还原, 而直角坐标系中所有线段会组成一个放射状的图, 由无三点共线可知, 这个图是不可能有交点的。
那么如果有多个环呢?
我们先考虑两个环, 我们随意交换两个环上的位置:
交换前:
交换 \(1\) 和 \(8\) 后:
可以发现, 交换后整个图变成了一个完整的环, 所以我们得到结论, 有多个环的环, 不考虑不相交的限制, 我们可以
选择两个不同的环通过随便在两个环上分别选点进行交换。
再回到一个环的时候, 那个时候只要是操作同一个位置就行, 所以可以随便选点。 再看看多个环的情况, 我们同样随便选个点, 建立直角坐标系, 按每个点所表示的向量的夹角对点排序, 然后依次判断是不是同一个环, 如果不是就交换一下, 跟据多边形, 我们可以容易地知道如果没有两个点所代表的向量夹角大于等于 \(\pi\) 那么一定没有点相交:
(大概长这样)
但如果存在夹角大于 \(\pi\) 的, 那么理论上可能会是:
但其实, 我们不连这条边, 我们也是能连接所有的环(考虑不连这个边, 连其他所有的合法边)
最后, 可能会出现中间的点是单独的, 初始已经复位的, 那么不影响, 我们直接判断就行。