dmy 线段

题面

给定 \(n\) 个线段,设 \(f(S)\) 表示 \(S\) 集合内线段的并的的长度,设 \(g(S)\) 表示 \(S\) 集合内出现最多的线段端点的数量

有 \(k\) 次修改,修改集合内的一些线段,输出最初状态和每次修改后的 \(max(f(S)-g(S))\)

解法

首先猜测答案的范围,设 $ F= f(全集)$,我们先考虑全集的情况,我们再去除一些不必要的线段

看最后的情况,发现对于一个坐标 \(x\),它最多有有两个线段的端点是 \(x\),且分别是左端点和右端点

所以答案的下界就是 \(F-2\)

我们发现 \(f(S)\leq F\),\(g(S) \geq 1\),所以 \(f(S)-g(S) \leq F-1\),即答案只能是 \(F-1\) 或 \(F-2\)

答案等于 \(F-1\) 时的充要条件是对于每个联通的线段并,其可以由端点不重合的线段覆盖

对于一条线段 \([l_i,r_i]\) ,它可以接上当且仅当 $ r_{i-2}<l_i<r_{i-1}<r_i$,这里钦定 \(r_0=L\),\(l_1=L\),\(r_k=R\),\([L,R]\)为一个连通块

那么我们就有一个 \(O(n^3)\) 的 \(DP\),记录最后的两个右端点 \((p,q)\),我们发现对于相同的 \(q\),只保留最小的 \(p\) 就行,这样就是 \(O(n^2)\)

那么我们记 \(h_x\) 为 满足 \(p<r<q\) 的最小的 \(q\) ,这样每次得到的新状态 \(p\) 一定是最小的,这个我们线段树维护 \(h\),可以做到 \(O(n\log n)\)

当我们将 \(r\) 排序时,发现只要 \(h\) 有值了,后面覆盖一定不优,所以维护一个递增栈就行,单次复杂度 \(O(n)\)

求 \(F\) 可以差分,排序可以用桶排,总体复杂度 \(O(nq)\)

posted @ 2026-10-07 14:52  Maple_Mist  阅读(21)  评论(0)    收藏  举报