专栏文章

题解:P14463 【MX-S10-T4】『FeOI-4』呼吸之野

P14463题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@minbdwv6
此快照首次捕获于
2025/12/01 23:38
3 个月前
此快照最后确认于
2025/12/01 23:38
3 个月前
查看原文
[1,m][1,m] 为值域。
枚举 mid=1mmid=1\sim m,将 <mid<mid 的位置设为 1-1mid\ge mid 的位置设为 11。每次将一个位置 111\to -1。对于每个位置 ii,维护 fif_i 表示使得区间 [j,i][j,i] 合法的最大的 jj
考虑如果存在 i<j,fifji<j,f_i\ge f_j,那么区间 [fj,j][f_j,j] 就包含了区间 [fi,i][f_i,i]。所以在当前时刻,区间 [fj,j][f_j,j] 就没有用了。并且当 midmid 继续变大时,[fj,j][f_j,j] 还是会包含 [fi,i][f_i,i]。所以可以直接将位置 jj 删掉。
于是我们发现一个右端点会在一个前缀时间存在。那我们考虑扫原序列,维护 mid=1mmid=1\sim m 的信息。
考虑对于一个 midmid 我们如何处理。首先我们需要维护上一个有用的位置。
令当前位置为 ii,上一个有用位置为 jj。考虑如果 a[j+1,i]>0a[j+1,i]>0,显然 fj<fif_j<f_i。所以我们考虑什么时候 a[j+1,i]0,fj<fia[j+1,i]\le 0,f_j<f_i。 注意到若 a[fi,i]0a[f_i,i]\ge 0,那么 a[fi,j]0a[f_i,j]\ge 0。也就是说,若点 fif_i 对于 jj 不合法,那么 jfi+1<kj-f_i+1<k,即 jk+1<fiik+1j-k+1<f_i\le i-k+1。我们发现这个区间的长度 =[j+1,i]=[j+1,i]。那么我们就可以用一个线段树维护前缀和 a[1,ik]a[1,i-k] 和历史最值。然后当位置 ii 变成新的有用的点时清空历史最值。用线段树维护每个 midmid 的信息,使用线段树上二分求出最后一个存在时间,可以做到 O(nlogn)O(n\log n)
考虑将查询按照 xx 从小到大处理,维护所有没有被删掉的点。然后答案会是一段区间,直接二分求出来即可。时间复杂度 O(qlog2n)O(q\log^2 n)
考虑用上述做法倒着做一遍,可以得到有用的左端点集合,并且两个集合的点是一一对应的。那么可以直接找到区间。时间复杂度 O((n+q)logn)O((n+q)\log n)

评论

1 条评论,欢迎与作者交流。

正在加载评论...