大白上的题目
#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} #define MAXN 100010 #define MAXD 20010 int num[MAXN]; int val[MAXD],lmin[MAXD],rmin[MAXD]; int lowbit(int x) {return x & (-x);} int sum(int x) { int ret = 0; while (x > 0) { ret += num[x]; x -= lowbit(x); } return ret; } void add(int x,int d) { while (x <= MAXN) { num[x] += d; x += lowbit(x); } } int main() { int T,n; scanf("%d",&T); while (T--) { scanf("%d",&n); memset(num,0,sizeof(num)); for (int i = 1; i <= n ; i++) { scanf("%d",&val[i]); add(val[i],1); lmin[i] = sum(val[i] - 1); } memset(num,0,sizeof(num)); for (int i = n ; i >= 1 ; i--) { add(val[i],1); rmin[i] = sum(val[i] - 1); } LL ans = 0; for (int i = 1; i <= n ; i++) ans += lmin[i] * (n - i - rmin[i]) + (i - lmin[i] - 1) * rmin[i]; printf("%lld ",ans); } return 0; }