专栏文章
P11983
P11983题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio4e75h
- 此快照首次捕获于
- 2025/12/02 13:11 3 个月前
- 此快照最后确认于
- 2025/12/02 13:11 3 个月前
第一想法是逐位确定,但是位与位之间的割裂难以提出复杂度优秀的做法。转换视角:从大往小考虑所有数 ,找到一个字典序最小的下标集合 ,然后将 的 赋成 并满足存在解。判断性问题即区间选点问题,判断最少选择点数(记为 )是否不大于 在 中出现次数(记为 )。考察 的形式,最开始肯定是不断取当前未选取位置中第一个,直到 ,回退这一步,然后再会被迫选取一些零散的点。 每次操作后至多增加一,则选取完一个未选点序列的前缀后有 ,随后加入零散点需满足 不发生变化。
如何求出该前缀?显然可以二分,但是实际上在 内的点和二分 check 的 大小可能完全不在同一级别,复杂度退化到平方及以上。如何保证复杂度正确?先找到最小的 使得选取前 个位置不合法,如此 和 中极长前缀大小 是同一级别,接下来在 内二分即可。找 复杂度是 的,后面是 的,不过可以事先将 个区间排好序,如此每次 check 顺次拉出,复杂度优化到 。这一部分均摊总复杂度 。
接下来考虑零散点的加入。将区间按左端点从大到小/右端点从小到大排序求出 表示选取的第 个点坐标下/上界,感受一下 中所有数都是可以取到的,且 两两不交即 (其实不太会说明啊)。这样子每次新加入一个区间 ,其与 的位置关系只有四种:
- 与所有 无交。
- 包含某个 。
- 仅与某个 有交。
- 和 有交。
如果是情况 则说明 不能被加入;情况 说明其不会对 序列产生任何影响;情况 思考一下发现就是将 向 取交;情况 并不会直接对 产生影响,因为上下界仍然是可以达到的,但是若在未来某个时刻 和 无交那么就会对 产生影响,在 上打个 tag 即可(形如若 则对 进行修改,用
priority_queue 维护,需要注意的是,最开始的 个区间也需要考虑这种情况),另一侧同理。当然我们需要保证考虑的 不能是情况 或者至少和情况 是同级的。这很简单,我们在每次 更新时求出编号最小的和他有交的未被选择的区间即可(同样用
priority_queue 维护),分讨 和 两种情况即可(对于 类区间则不必考虑编号的优先性,同样容易处理),开个线段树维护。复杂度 。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...