【题解】P13780 「o.OI R2」愿天堂没有分块

https://www.luogu.com.cn/problem/P13780

\(\mathrm{mex}\) 理论:

  • 极小 mex 区间:不存在 \(\mathrm{mex}(l,r)=\mathrm{mex}(L,R)\),满足 \([l,r]\subset[L,R]\)
  • 结论:极小 mex 区间只有不超过 \(2n\) 个。
    • 显然 \(a_{l}\ne a_r\),否则可以删除其中之一。
    • \(\mathrm{mex}(l+1,r-1)=\min(a_l,a_r)\),因为加入后 mex 发生改变。不妨假设 \(a_l<a_r\)
    • 由于 \(\mathrm{mex}\) 单调不降,所以 \(\mathrm{mex}(l+1,r-1)=a_l\) 的情况只会有至多 1 个最小的 \(r\) 满足这个条件。
    • \(a_l>a_r\) 同理,所以只有 \(O(n)\) 个极小 mex 区间。
  • 求解极小 mex 区间:
    • \(a_l<a_r\)
    • 显然 \([l+1,r-1]\) 中没有出现过 \(a_l\)。考虑删除 \(a_r\) 后,\(\mathrm{mex}(l,r-1)=a_r\),设其对应的极小 mex 区间为 \([l',r']\),则 \(a_l\) 在该区间中出现了,即有 \(l'=l\)
    • 所以极小 mex 区间是由另一个极小 mex 区间拓展一个端点得到的。
    • 使用 vector 维护所有的 \(\mathrm{mex}=x\) 的极小 mex 区间,找到第一个 \(a_x=\mathrm{mex}(l,r)\),求区间 mex 可以通过主席树处理(扫描线维护 \(lst\) 数组)。
    • 注意求出来的可能不是极小的,所以要排除。

那么把询问离线,扫描线,维护所有极小 mex 区间 \([l',r']\) 满足 \(r'\le r\)\(l'\) 最大值。
这样就可以在线段树上二分求解 mex mex 了。

posted @ 2026-05-06 13:36  TallBanana  阅读(19)  评论(0)    收藏  举报