传送门:https://ac.nowcoder.com/acm/contest/7329/E

题目大意:给你一个长度为1e6的排列,让你统计 区间[L,R]是一个值域为[L,R]的排列 的 区间个数.

昨天比赛的时候看了一下题目以为是析合树,就没写了emm,其实正解思路很简单。。

题目思路:

1.对于每一个点 x,我们求出以它为右端点 的 【合法左端点 L 的区间范围 】使得
2.再求出以x为左端点的 【合法右端点R的区间范围】 使得





上述算法实现方式(可选): 单调栈 + 二分 / ST表 + 二分 (后者注意常数问题)

现在考虑两个点对.当 时, 点对产生贡献。

现在问题转化为:在序列上求合法的点对个数.

这里介绍一个较容易也是很经典的做法是:树状数组 + 扫描线 + 差分求贡献。

将所有的【合法右端点区间】拆成左右两个端点放入集合。然后对集合按端点大小升序排序。

之后遍历一遍数组,维护一个从左至右的指针.对于i的情况进行简单讨论:

AC代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=44991792