vjudge链接VJ
原题链接(推荐)
其实,他就是问了这么一个问题,问所有区间的第二大的数之和,那么我们其实很容易发现一个规律,就是每个数会对答案产生的贡献。
每个数,在它的左边和右边,分别有第一个大于它的数,和第二个大于它的数,我们可以首先处理出来这个。然后看一下图例:
蓝色区间长度相乘加上红色区间长度相乘,所以不就是“本身”这个值产生的贡献的次数了吗?然后就可以计算出来了。
那么问题就转变成为怎么求左边的第一个比他大的,和第二个比他大的(右边同理),我们可以不断的向左二分区间最远到达长度,然后就可以求出来第一个大于它的值的所在的位子,然后再继续找下去,时间复杂度O(log * log),又因为要找N次,所以总的复杂度是O(N * logN * logN)。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include