前言
好困难啊, 最近的新目标是吧效率拉起来
思路
转化题意
一问
对于 \(n\) 条线段, 我们对于每条线段, 都要分到两个场地中的一个或者放弃, 求如何分配使得两个场地不存在 \(i\) 满足 \(i \in S_1\) 且 \(i \in S_2\) (其中 \(S_1, S_2\) 分别表示两个场地线段的集合) , 并且使得较少的场地的线段数最多
二问
求当钦定 \(i\) 线段必选时, 并且使得较少的场地的线段数最多
先考虑一问
这个题我们发现, 如果你考虑单条线段, 不太好做, 原因是题目中的限制条件和线段没什么关系, 所以我们考虑按照点来 \(\rm{dp}\)
令 \(f_{i, j}\) 表示对于前 \(i\) 个时间点, 给 \(1\) 号场地 \(j\) 条线段, 此时另外一边选择线段的最大值
我们讨论一段区间内, 几条线段全部给 \(1\) 号或者 \(2\) 号场地时的最优收益
其中 \(tot\) 为预处理出的 \(l \sim r\) 区间中, 有多少条被完全覆盖的线段
这样我们可以 \(\mathcal{O} (n^3)\) 且比较自然的完成一问
答案即为 \(\displaystyle\max_{i = 1}^{n} \{f_{m, i}, i\}\)
考虑二问
容易发现的是, 当我们钦定 \(i\) 条线段必须选时, 其前后两段的性质与第一问无异
我们考虑处理前后缀, 把第一问的 \(f\) 数组作为 \(pre\) , 然后新做一个 \(suf\) 数组来枚举后缀
我们令 \(f_{l, r}\) 表示钦定 \(l \sim r\) 必选, 此时的最优解, 相似的, 枚举前后选择的数量, 有
考虑答案, 我们不能简单地用钦定的线段的 \(l, r\) 来处理, 因为有可能会出现线段与钦定线段重叠, 那么我们还需要想办法把他也选上
答案即为 \(\displaystyle\max_{l = 1}^{s_i}\max_{r = s_i + t_i}^{m} f_{l, r}\)
但是这样的复杂度为 \(\mathcal{O} (n^4)\) , 不够优秀
注意到当 \(x\) 一定, 那么当 \(y\) 增大时, \(suf_{r, y}\) 一定单调不增, 利用这个单调性, 我们把 \(y\) 当做一个指针, 即可优化掉一维
具体的, 当 \(x\) 增长, 只有 \(y\) 减小才能找到更优秀的答案
实现
并不难写, 就不写了
总结
状态的设计应当便于处理限制
善于找到新增问题与原问题的共同点, 然后转化问题
善于手动模拟算法来找到问题
单调性优化非常的好用