luogu P3308 [SDOI2014]LIS

发布时间 2023-03-29 18:11:14作者: 275307894a

题面传送门

涨知识了,第一次知道网络流删边不用全图重跑。

首先我们先跑一个暴力dp,出 \(f_i\) 表示以 \(i\) 结尾的最长上升子序列长度。然后我们将其按照这个 dp 值分层,相邻层之间能转移的连边,这样子可以得到一张 DAG,我们的目的就是割掉一些点,让 DAG 中 \(dp_i=1\) 的无法走到 \(dp\) 值最大的点。

这是好处理的,我们将每个点割开成两个点,分别为出点和入点,两个点之间连接一条权值为 \(B_i\) 的边,那么其最小割就是最小的费用。

接下来考虑求出这个答案。将所有点按照 \(C_i\) 排序,然后每次强制一个点被割掉,看看剩下图中的最小割加上这个点权值是不是和答案一样即可。

每次重新跑 Dicnic 时间复杂度高达 \(O(n^4)\) 显然不能接受。可以发现每次只是改变一条边,这里可以退流。

假设这条边为 \(u\to v\),源汇点为 \(S,T\),那么我们求 \(u\to S\) 的最大流,和 \(T\to v\) 的最大流,这样子就将这条边的流量退掉了,退了之后可能产生新的流量,因此再求一边 \(S\to T\) 的最大流就是答案。

时间复杂度 \(O(Tn^3)\) ,可能需要一些卡常技巧才能过。

submission