Skip to content

P15850 [NOISG 2026 Finals] 宝石 / Gemstones 笔记 ​

首先大家都知道配对的方法是用栈从左往右模拟,那么对于多次询问,我们可以给每个左端点都开一个栈,时间复杂度 O(n2)。

但是 n 个栈里很多信息都是重复的,比如 a[5,8] 可以消去,那么从 a3 开始的栈在栈底保留 a3,a4,后面的操作就会和 a5 开始的栈一致,关键在于如何共享栈状态,这启示用树状结构。

具体地,为了模拟栈的消除操作,我们采用字典树,从根节点(空串)出发不断插入 ai,如果可以消除就往父节点走,否则就往下走创建新点。这样子对于可以消除的段,最终都会走回原点。

那么查询 [l,r],就记录 al−1,ar 在字典树上的位置,用 LCA 查询他们的树上距离即可。使用倍增 LCA,时间复杂度 O(nlog⁡n)。

最近更新