CF833E

CF1889C1 很像。

多次询问,我们考虑将每个段的端点标记,将值域分成若干个段。

我们如果可以求出前缀段通过删除能得到的最多空点个数,由于每一段要么全空,要么全被覆盖,所以我们可以二分从而求出答案。

扫描线,找到被覆盖 2\le 2 的段,维护到每段区间末尾为止空点的长度 aia_i,删除至多两个区间后最多空点数 bib_i,只被第 ii 个区间覆盖的长度 fif_i,则 bi=max(ai+X)b_i=\max(a_i+X),其中 XX 是这个前缀最多能通过删区间得到多少额外的长度。

删除一个区间的情况不说。

考虑删除两个区间的情况:

  • 存在被这两个区间覆盖的段,只有 O(n)\mathcal O(n) 个,我们记录只被这两个区间覆盖的长度 rr,其中 ci+cjwc_i+c_j\le wfi+fj+ri,jf_i+f_j+r_{i,j} 可以贡献, 记录 gi=max(fj,ri,j)g_i=\max(f_j,r_{i,j}),在 fif_i 更新时,fi+gif_i+g_i 可以贡献。
  • 否则,ci+cjWc_i+c_j\le Wfi+fjf_i+f_j 可以贡献,树状数组维护前缀 max 即可。

分类讨论一段被覆盖的情况,首先得满足被 2\le2 条线段覆盖:

  • 00 个区间覆盖,ai+lenaia_i+len\to a_i
  • 11 个区间覆盖,更新 fif_i,更新上面两部分的贡献。
  • 22 个区间覆盖,更新上面第二部分的贡献。

时间复杂度 O((n+m)logn)\mathcal O((n+m)\log n)

posted @ 2023-11-05 12:01  蒟蒻orz  阅读(1)  评论(0编辑  收藏  举报  来源