显然是一个类似流的问题。
考虑一个 \(O(n\log n)\) 求单个 \(i\) 的过程:从右到左扫,对于每个 \(i\) 分配左端点最大的区间的流量。
考虑直接维护这个过程,对于每个 \(i\),分成 \([i,n]\) 和 \([1,i)\) 两部分,如果我们对于 \([i,n]\) 贪心完成了分配,那么 \([1,i)\) 的流量只需要 Hall 定理即可计算。
让 \(i\) 从右到左扫描线,发现如果一个流量被扔到了右边,则其会一直留在右边直至过期,则可以用一个线段树通过 Hall 定理维护已经钦定流到右边的流,另一个线段树维护还没有钦定流到右边的流。
删除和加入区间都容易在第一个线段树上表示出来,然后我们需要处理将一些还没有钦定流到右边的流流到右边的过程。
这个过程分成三步:
- 找到最左边的 \(x\) 满足可以在这个 \(x\) 新增一个流量。
- 找到右端点在 \([x,n]\) 区间内,左端点最大且还有流量没有流到右边的区间 \([l_i,r_i],c_i\)。
- 计算能将这个区间分配到右边多少,在两棵线段树以及维护左边的线段树上更新。
可以证明这个操作过程总和不会超过 \(O(n)\) 次,每次一定是会导致如下三种情况之一:
- 在新增完流量之后没有位置可以新增流量了
- \(i\) 已经全部流到右边
- \(r_i\) 原来不是全部属于 \(i\),现在是了。
这三种情况都是 \(O(n)\) 的,总复杂度 \(O(n\log n)\)。
标签:PR,右边,线段,Pjudge,21751,流量,端点,区间,钦定 From: https://www.cnblogs.com/275307894a/p/18468601