P3960 [NOIP 2017 提高组] 列队 题解
本文提供一种动态开点线段树做法。
这道题写的时候调了很久,原因是
while(q--),而处理询问时又用到了。
另外,sjx 在讲义中这样写:
为了解决空间问题,我们可以离线所有查询、删除和追加操作,然后 one by one 用线段树处理每个序列,每一个处理完后回滚到初始状态,再处理下一个。
为了解决空间问题,直接动态开点不就是了。
我们发现,每一行是相对独立的,所以考虑单独处理。对于每一行的前 vector 里面。
具体地,对于一次操作,需要进行以下操作(假设
- 在第
棵线段树上二分找到 的真实位置,从而得到 的值(并输出); - 将
插入到第 棵线段树(用于维护最后一列)的末尾; - 从第
棵线段树中删除 ; - 在第
棵线段树上二分找到 的位置,从而得到 的值; - 将
插入到第 棵线段树的末尾; - 从第
棵线段树中删除 。
时间复杂度
关于线段树节点数量,估算下来理论上限是
在代码实现中,线段树中的 0 指未被删除,1 指已被删除,这样处理的目的是在末尾插入元素时不需要访问线段树元素。
由于每个询问一定有解,所以线段树二分时没必要判断无解,整个过程也不需要考虑下标越界的问题,没什么细节,个人认为比较好写。
1 |
|
- Title: P3960 [NOIP 2017 提高组] 列队 题解
- Author: Getaway_Car
- Created at : 2025-07-14 20:00:00
- Updated at : 2026-01-19 20:18:02
- Link: https://getawaycar1024.github.io/article/P3960-NOIP-2017-提高组-列队-题解/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments