CF724E(模拟网络流)

· · 个人记录

这题有一个很显然的网络流做法,每个点从源点向他连边,他向汇点连边,两两连边。

但显然不行,用数据结构优化建边也不行。

我们考虑模拟网络流(从最小割的角度来看)

因为每个边边权都是C,这具有提示性,图富有特征。

我们考虑dp[i][j],表示考虑割到第i个点,j个属于S集合,我们如何转移?

考虑i点的归属:属于S,只要割T的边就可以 属于T,要把前面j个S集合连向他的都割掉,并且把S集合的边割了。

dp是n^2复杂度的。(可以通过)

如何优化?贪心。

我们写出柿子,可以发现,是所有归属S的s[i]之和+所有归属T的p[i]之和+c*S集合向T集合两两的对数(S元素在前)

假设我们一开始都划入T,一个一个放入S集合,考虑放入一个元素位于第i位,已经放入S个了,总贡献的变化是(n-i-|S|)*c+s[i]-p[i]

解释一下前半个柿子的意思,是当前归入S集合,则连向后面的n-i条都要割(但是,n-i个中,如果已经有属于S集合的就不用)。前面i个中如果有属于S集合的,那么连向他的边就不用割了

把柿子拆分一下,就可以独立出每个的贡献。sort一遍就可以