这种题不太需要考虑去重的问题,如果能把所有合法的区间都表示为矩阵,那么就变成了矩阵加、数有多少个点大于
0,可以排序扫描线,用树状数组维护。
那么我们考虑如何把所有合法区间都表示为矩阵加的形式。首先我们可以去找每个子序列
b[l,r] 的左右两个端点
i,j 满足
min(al∼ai)+max(ai+1∼ar)=k,min(al∼ai−1)+max(ai∼ar)=k,min(al∼aj−1)+max(aj∼ar)=k,min(al∼aj)+max(aj+1∼ar)=k,然后我们可以去找到所有的
[l,i],对于它们去找一个区间
[l′,r′] 满足
∀t∈[l′,r′],min(al∼ai)+max(ai+1∼at)=k,那么矩阵
[l,i][l′,r′] 就刻画了一堆合法的
b,关于
j 的刻画是同理的。关于这个的实现,首先找
[l,i] 我们可以按照
a 从大到小加入所有位置,不妨设当前的值为
x,则我们找到每个
x 结尾的最长区间使得这个区间的所有元素都
≥x,就找到所有
[l,i] 了。然后
[l′,r′] 可以二分找,check 只需要一个静态的区间最值,用 st 表即可。总时间为
O(nlogn)。