只要记录一个数的前面有多少比他大的,后面有多少比他小的就可以了。
代码:
#include <stdio.h> #include <string.h> #define MAX 1000100 typedef long long ll ; ll t[MAX] , a[100100] , b[100100] ; ll lowbit(ll x) { return x&(-x) ; } ll getSum(ll pos) { ll sum = 0 ; while(pos>0) { sum += t[pos] ; pos -= lowbit(pos) ; } return sum ; } void update(ll pos) { while(pos<MAX) { t[pos]++ ; pos += lowbit(pos) ; } } int main() { int n; scanf("%d",&n) ; ll sum = 0 ; for(int i = 0 ; i < n ; ++i) { scanf("%I64d",&a[i]) ; ++a[i]; b[i] = i-getSum(a[i]) ; update(a[i]) ; } memset(t,0,sizeof(t)) ; for(int i = n-1 ; i >= 0 ; --i) { b[i] += getSum(a[i]-1) ; sum += ((b[i]+1)*b[i])/2; update(a[i]) ; } printf("%I64d\n",sum) ; return 0 ; }
原文地址:http://blog.csdn.net/lionel_d/article/details/44925025