把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

Pjudge #21751. 【PR #8】养鸡

题面传送门

显然是一个类似流的问题。

考虑一个 \(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)\)

submission

posted @ 2024-10-15 22:05  275307894a  阅读(31)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end