专栏文章

NOIP2024 T4

P11364题解参与者 15已保存评论 16

文章操作

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

当前评论
16 条
当前快照
1 份
快照标识符
@miqr91t1
此快照首次捕获于
2025/12/04 09:26
3 个月前
此快照最后确认于
2025/12/04 09:26
3 个月前
查看原文
一个硬维护的做法,居然没人是这样做的(
特判掉 k=1k=1 的询问,对于 k2k\ge 2,区间 LCA 的深度为 minli<rdepLCA(i,i+1)\min_{l\le i < r} \operatorname{dep}_{\operatorname{LCA}(i,i+1)}。(证明考虑一下虚树,这里不再赘述)
那么问题可以转化为:有一个序列 aa,询问 l,r,kl,r,k,求 maxp[l,r](mini[p,p+k1]ai)\max_{p\in [l,r]} (\min_{i\in [p,p+k-1]} a_i)
这可以看作:把 aa 数组进行 k1k-1ai=min(ai,ai+1)a_i = \min(a_i,a_{i+1}) 的操作,然后求 aa 的区间最大值。
把询问按照 kk 排序,问题转化为:
  • aa 数组进行 ai=min(ai,ai+1)a_i = \min(a_i,a_{i+1}) 的操作,操作完长度减一
  • aa 数组区间最大值
假设 aa 的所有元素不同,否则给 aa 的相同元素也钦定大小顺序。
考虑直接维护 aa 中的每个值域连续段。每次进行 ai=min(ai,ai+1)a_i = \min(a_i,a_{i+1}) 的操作后,每个连续段长度可能变化 1/0/1-1/0/1
如果连续段的值比两边都小,长度会加 11;比两边都大,长度会减 11;否则长度不变。
具体的:设 l,rl,rii 这个段左边和右边的连续段。考虑设 di=[ai<al]+[ai<ar]1d_i = [a_i < a_l] + [a_i < a_r] - 1,在每一次变化后,aia_i 这个值的连续段长度加上 did_i。(如果 al/ara_l/a_r 不存在则设 al/ar=a_l/a_r=-\infty
如果一个连续段长度变为 00,则这个连续段要删掉,并且更新左边、右边连续段的 did_i
可以在线段树上维护每个连续段的 ai,dia_i,d_i 和长度,以及当前 di=1d_i=-1 的连续段的长度最小值,用链表维护删除。
查询在线段树上二分一下,修改需要打标记,然后不断删除长度变为 00 的连续段。
时间复杂度 O((n+q)logn)O((n+q)\log n)

评论

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

正在加载评论...