考场上不会做。
如果考虑删掉哪些区间实际上不太可做。正难则反,转化贡献,考虑哪些点可以有贡献。
显然一个点如果可能有贡献,那么当且仅当覆盖它的区间 \(\le K\) 个。
于是我们记一个状态 \(f_{i,j}\) 表示前 \(i\) 个点中, \(i\) 是最后一个贡献的点,已经删除了 \(j\) 段区间了。
那么如何转移呢,考虑枚举上一个点 \(q\) 。
记 \(t\) 为覆盖着 \(i\) 的区间 , \(tt\) 为同时覆盖 \(i,q\) 的区间。
那么 \(f_{q,j}+1\to f_{i,j+t-tt}\)
显然如果直接枚举 \(q\) 肯定超时的。
考虑一些性质,我们发现可以对 \(tt\) 相同的一些段同时处理,然后用数据结构维护快速查询最大值,那么这题就做完了。
时间复杂度 \(O(nK(K+\log n))\) 。
要用 \(st\) 表来做到 \(O(1)\) 查询。
启示:
- 正难则反,如果一种算贡献方法做不了,就转化算贡献方式。