2021 第二轮省队集训 Day2

A

因为每个点的入度至多为 (1),所以原图是一个基环树森林。

对于每棵基环树,每次将它里面的无出度的点删掉,就能得到环上的点。

可以发现环上的那些点可以随意转化,于是缩成一个即可。

再对于所有基环树和普通树的根 (x),连边 (0 o x)。这样就能把它变成一棵树。

看到“最小值最大”,考虑二分答案。每次二分时 dp 一遍即可。

但这玩意常数巨大。可以先把 dfs 序预处理出来,二分的时候就不用递归了。

B

枚举右端点 (r),考虑如何快速计算答案。

(lgets rdots 1) 时,某些点会使 (max) 改变,某些点会使 (min) 改变。如果直接维护三个序列的极差的积显然没法做。考虑在线段树上维护 (A) 的极差、(B) 的极差、(C) 的极差、(A) 的极差乘 (B) 的极差、……、三个序列极差之积。

对于三个序列极差的更改分别更新。维护六个单调栈,算出被每个点 pop 掉的那些点,对于这个区间更新极差即可。由于每个点最多被弹出一次,所以时间复杂度是 (O(n log n)) 的。

但要注意如果同时维护最大值和最小值就不具有这种均摊性质了。于是只能区间加而不能区间赋值。

Written by Alan_Zhao
原文地址:https://www.cnblogs.com/alan-zhao-2007/p/sdptt-2021-2-day2.html