T1.旅行
大致题意:有一个图,第 \(i\) 次,删除第 \(i\) 个点,或者删除第 \(i\) 个点,并将他的所有邻居连起来。
每次询问可以通过一组路径相互到达的结点对数。
对于询问的内容,由于是无向图,只有在同一个连通块中的节点才能互相到达。
假设有 \(t\) 个连通块,设第 \(i\) 个连通块的大小为 \(sz_i\) ,于是一个连通块中满足要求的点对数量有 \(\frac{(sz_i-1)sz_i}{2}\) 。
于是问题转化成 \(\sum{\frac{(sz_i-1)sz_i}{2}}\) 。
对于本题的操作,我们应该可以联想到一个经典的问题。
如果将第二种操作去掉,我们只需要将整个过程倒过来,把删点变成加点,用并查集维护即可。
那么我们是否可以用类似的方法处理?
考虑第二个操作,容易发现,这个操作不会影响其所在连通块的连通性,只会使连通块大小 \(-1\) 。
于是,我们可以认为第二个操作就是将该点所在连通块大小 \(-1\) ,倒过来也就是 \(+1\) 。
由此,我们可以倒序处理,一开始,只存在要进行操作二的点,他们的连通块大小为0。
倒叙操作时,对于操作一,我们将那个点加入,将连通块大小设置为1,然后加边。
对于操作二,我们将那个点所在的连通块大小加一。
每次连通块大小改变时,减去原来连通块的大小的贡献,加上新的连通块大小的贡献。
T2.造山
大致题意:对于一个序列,对于每个元素每次操作可以 \(+1\) 或 \(-1\) ,求最少多少次操作可以使得原序列严格上升。
首先,有一个很常见的trick,那就是对于严格上升序列,或者类似的各种严格的大于或者等于这些东西。
我们可以令 \(a_i-=i\) 。这样就将严格的,转换成不严格上升序列。
我们可以观察得出一个结论,修改后的数组的数集,应该是原数组的数集的子集,这个可以用调整法证明。
然后我们对数组离散化,就可以进行dp。
令 \(f[i][j]\) 表示前 \(i\) 个数,将第 \(i\) 个数修改为 \(j\) 并且满足不严格上升最小需要几次修改。
\(f[i][j] = \min(f[i][j],f[i-1][1\dots j])\)
这是一个 \(O(n^3)\) 的东西。
但发现,只需要对其进行一个前缀min的优化即可到 \(O(n^2)\)
(这题有\(O(n\log n)\)的做法,需要slope trick,可以自行学习)