BISHI121 数列后缀极大位置统计¶
简单通过率 51.16%python3样例通过牛客 AC
一句话
每次尾部加数后,输出所有后缀最大值下标的异或和。
解题思路¶
这题考什么¶
一个漂亮的等价刻画:「后缀最大值下标的集合」就是单调递减栈本身。
为什么?栈内保持严格递减,意味着栈里每个元素都严格大于它右边所有还在栈里的元素; 而一旦某个元素被弹出,说明它右边出现了一个 >= 它的数, 「对所有 i<j 都有 a_i > a_j」立刻不成立。两边正好互为充要。
于是每次操作只需:弹掉栈顶所有 a[top] <= x 的下标,再把当前下标压栈。
数据规模与复杂度¶
n <= 1e5。每个下标最多进栈一次、出栈一次,总复杂度 O(n)。
坑在哪¶
- 弹栈条件必须是
<=(相等也弹)。因为题目要求「严格大于」右边所有元素, 相等时条件不成立。写成<就 WA——这题唯一的思维点就在这个等号上; - 异或和要增量维护:弹出时异或一次、压入时异或一次。 异或的自反性(x^x=0)保证了「再异或一次 = 移除」。 每次重新 reduce 整个栈是 O(n^2),1e5 会挂;
- 下标从 1 开始。
参考实现¶
[:octicons-arrow-left-16: BISHI120](BISHI120.md) [BISHI122 :octicons-arrow-right-16:](BISHI122.md)