考虑链上的联通块性质。
发现对于f(l,r)中,设一个联通块[x,y](位置),那么它一定满足ax−1∈/[l,r],ay+1∈/[l,r],ax∈[l,r],ay∈[l,r]。
于是我们只用数这个序列中有多少个相邻的位置使他们一个在区间里,一个不在,然后除以2,就是联通块个数。
于是它O(n3)啦!
于是它TLE on test 9啦。。。
然后我们发现,l固定时,对于一个相邻位置:
如果ai,ai+1都小于l,那扔掉。
否则如果有一个小于i,那就在max(ai,ai+1)加入。
否则它只会在 min(ai,ai+1) 的时候加入,在 max(ai,ai+1) 时扔掉。
然后它O(n2)啦!
于是它TLE on test 11啦。。。
于是我们稍微一分析,发现答案可以写成
∑i=1n2∑j=0n[aj,aj+1中有一个小于i]∗(n−max(a[j],a[j+1])+1)
加上
∑i=1n2∑j=0n[aj,aj+1都大于i]∗((n−min(a[j],a[j+1])+1)−(n−max(a[j],a[j+1])+1))
然后发现每对相邻的数只会从下面的式子掉到上面的式子一次。
于是可以用一个优先队列维护在下面的相邻数对。
O(nlogn)了。