Loading

2021 第二轮省队集训 Day2

A

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

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

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

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

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

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

B

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

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

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

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

posted @ 2021-06-02 16:12  Alan_Zhao_2007  阅读(42)  评论(0编辑  收藏  举报