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一遍就可以