当时没想到用 大数,没过,,只说一下思路吧
首先 枚举所有子集分别找逆序对数肯定不行
然后可以想到每个逆序对可能会对很多个区间有贡献,
问题转化成我们找到一个逆序对ai-aj,看他为多少个区间提供了贡献,,也就是有多少个区间包含了 ai - aj 这个逆序对;
我们只要找到每一个逆序对的i-j这两个位置就行了,i < j ,ai > aj ,那么这个逆序对的贡献就是 i * (n - j + 1) ,数组下标 1~n
所以从前往后扫,用树状数组维护前面扫过的下标和,在这之前吧 数组的值离散化, 按照值将ai 的下标存入树状数组,
对于后面的 aj,可以知道 aj 之前的和aj 构成逆序对的所有的贡献值,,我们通过树状数组得到 aj 之前大于 aj 的数的下标和 sumi ,
则贡献值为: sumi * (n - j + 1);