一开始做麻烦了,关键是写麻烦了还没过,好气哦。
这题应该有很多不同的思路。我的想法是计算给出的数组中每一对相邻的数在之后的排列(Permutation)中距离的变化,然后只要以第一个排列的答案为基准,加上之后排列的距离变化就是后面排列的答案了。
那么距离是如何变化的呢,我们设一对相邻的数中比较小的数是l,比较大的数是 r,那么他们在第一个排列中的位置就是这样的:
1,2,…,l,…,r,…,n−1,n
在第一个一直到第l−1个排列中,l和r的位置都没有发生变化,自然距离也不变。但在第l个排列中,l成了第一个数:
l,1,2,…,l−1,l+1,…,r,…,n−1,n
l与r的距离增加了l−1。
在第l+1到r−1个排列中,l与r中的某一个数会在最前面,所以l与r的距离比最开始少 1。
在第r个排列中,r 跑到了最前面:
r,1,2,…,l−1,l,l+1,…,r−1,r+1,…,n−1,n
注意此时 l 的位置依然是l+1,所以距离的变化是(l+1−1)−(r−l)=2⋅l−r
如果我们用一个数组 a 来保存所有排列中答案的变化,那么对于每一对(l,r),我们应该做如下三个操作:
- al:=al+l−1
- ai:=ai−1,i=l+1,…,r−1
- ar:=ar+2⋅l−r
由于其中涉及到区间修改,所以我们可以用差分的思想来实现,并且由于只会查询一次,所以用最简单的数组就可以了,具体实现见代码: