Codeforces Round 906 (Div. 2) Doremy's Drying Plan E1.&E2
先考虑\(E1\) 只需要删除两条线使得不被覆盖的点数最多。
观察到点数只有\(200000\) 那么我们完全可以先将被至少\(3\)条线覆盖的点删掉。
考虑枚举一条线,枚举这条线覆盖的点寻找另外一条线覆盖这些点中的最大值,然后再找没覆盖这些点之外的线的最大值即可。
复杂度容易证明是线性的。
考虑\(E2\) 需要我们删除\(k,k\le 10\)条线求出不被覆盖的点数最多。
点的数量不变,遇到这种贪心没办法解决的问题,由于点的规模很大,也不能使用网络流,只能考虑\(dp\)。
设状态\(f_{i,j}\)表示前\(i\)个点且第\(i\)个点必无覆盖已经删掉\(j\)条线的最大值。
考虑枚举上一个未被覆盖的点\(k\) 设包含\(i\)的线段数量-包含\(i\)包含\(k\)的线段数量为\(v\) \(f_{i,j}=max\{f_{k,j-v}\}\)
我们可以先把那些被覆盖超过\(10\)次的点扔掉。
这样上述转移是\(n^2k^2\)的或者优化一步为\(n^2k\)的。
考虑进一步优化这个转移式无非是求最大值
利用线段树维护即可。
注意到我们需要外层枚举\(j\) 还需要不断更改\(f{k,j-v}\)这个东西,可以暴力的修改。
因为最多修改\(nk\)次。
总复杂度\(nklogn\)。