摘要:
题目给定长度为 $n$ 的序列,有 $q$ 次询问,每次询问区间 $[l,r]$ 的最短子区间 $[l',r']$,使 $[l,r]$ 中出现的数都在 $[l',r']$ 中出现,需输出 $[l',r']$ 的长度,$1\leq n,q\leq 2\times 10^6$,$1\leq a_i\leq n$。解题思路上,先有 $O(n^2)$ 的双指针暴力法。题解采用扫描右端点 $p$ 的方法,用数据结构维护右端点为 $p$ 时每个下标 $k$ 代表后缀的最小合法前缀 $f_k$,找出 $a_p$ 上一次出现位置 $la_p$,将询问的 $l$ 落在 $(la_p,p]$ 区间的 $f$ 对 $p$ 取 $\max$,使用并查集让 $la_p$ 指向 $la_p +1$ 以找到最大合法数据左端点 $d$。还可将问题类比二维偏序问题,转化为维护每个后缀点对权值来求解,因数据点权值维护需按顺序,所以按第二维一定顺序扫描。代码中用 zkw 线段树处理,添加了快读以优化。
阅读全文