#include<iostream> #include<cstdio> #include<algorithm> usingnamespacestd; typedeflonglong LL; typedefpair<int,int> PII; #define x first #define y second constint N = 100010;
int n; LL h[N]; PII temp[N]; PII w[N];
voidmerge_sort(int l,int r){ if (l >= r) return; int mid = l + r >> 1; merge_sort(l,mid),merge_sort(mid+1,r); int i = l,j = mid+1,k = 0; while (i <= mid && j <= r){ if (w[i].x <= w[j].x){// 计算i后面比它小的数的个数 h[w[i].y] += j - mid -1;// 相对于i来说,j 前面的数都比它小 temp[k++] = w[i++]; } else{// 计算j前面比它大的数的个数 h[w[j].y] += mid - i +1;// 相对于j来说,i 后面的数都比它大 temp[k++] = w[j++]; } } while (i <= mid){// 计算i后面比它小的数的个数 h[w[i].y] += r - mid;// 相对于i来说,mid+1到r所有的数都比它小 temp[k++] = w[i++]; } while (j <= r){ temp[k++] = w[j++];// 相对于j来说,不存在逆序对了 } // 物归原主 for (int i = l,j = 0;i <= r;i++,j++) w[i] = temp[j]; } intmain(){ scanf("%d",&n);// w[i]第一维是身高,第二维是下标,读入顺序 for (int i = 0;i < n;i++) scanf("%d",&w[i].x),w[i].x++,w[i].y = i; merge_sort(0,n-1); LL res = 0; for (int i = 0;i < n;i++){ res += (LL)h[i]*(h[i]+1)/2; } printf("%lld\n",res); return0; }