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)\)

浙公网安备 33010602011771号