E题题解

知乎个人补题链接,思路+代码

思路

为什么要数据随机?因为不随机做不出来。

考虑这么一个例子,

1 2 3 4 5 6 7 8 9 ...

我们要取出所有的区间,复杂度是 的,直接爆炸。

现考虑随机性。

我们固定左端点,右端点在不断右移的时候,能够使得区间改变 的位置是有限的。

为什么?

改变 需要严格大于,每次选出一个大于其的数,后续严格大于的期望其实是在不断折半的,因此最多 个。同理对于 ,所以我们固定左端点,右端点有效移动的位置,是这些严格 大于/小于 的位置之和,最多 个,我们通过单调栈 + 双指针 即可完成模拟。

实现

通过单调栈找严格 大于/小于,然后通过双指针取出这些位置, 记录 的数量,最后丢进数组中,记录 即可。

代码

代码