The Romans have attacked again. This time they are much more than the Persians but Shapur is ready to defeat them. He says: “A lion is never afraid of a hundred sheep”.
Nevertheless Shapur has to find weaknesses in the Roman army to defeat them. So he gives the army a weakness number.
In Shapur’s opinion the weakness of an army is equal to the number of triplets i, j, k such that i < j < k and ai > aj > ak where ax is the power of man standing at position x. The Roman army has one special trait — powers of all the people in it are distinct.
Help Shapur find out how weak the Romans are.
Input
The first line of input contains a single number n (3 ≤ n ≤ 106) — the number of men in Roman army. Next line contains n different positive integers ai (1 ≤ i ≤ n, 1 ≤ ai ≤ 109) — powers of men in the Roman army.
Output
A single integer number, the weakness of the Roman army.
Please, do not use %lld specificator to read or write 64-bit integers in C++. It is preffered to use cout (also you may use %I64d).
Sample test(s)
Input
3
3 2 1
Output
1
Input
3
2 3 1
Output
0
Input
4
10 8 3 1
Output
4
Input
4
1 5 4 3
Output
1
两次树状数组维护,第一次维护求出每一个位置上的逆序数的对数
第二次维护到目前为止,插入到树状数组上的逆序对的总数目
数据较大,离散化一下
/*************************************************************************
> File Name: CF-57-E.cpp
> Author: ALex
> Mail: zchao1995@gmail.com
> Created Time: 2015年03月23日 星期一 21时00分16秒
************************************************************************/
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair <int, int> PLL;
const int N = 1010000;
LL tree[N];
LL inver[N];
int val[N];
LL pre[N];
int xis[N];
int cnt;
int binsearch(int x)
{
int l = 1;
int r = cnt;
int mid;
while (l <= r)
{
mid = (l + r) >> 1;
if (xis[mid] > x)
{
r = mid - 1;
}
else if (xis[mid] < x)
{
l = mid + 1;
}
else
{
break;
}
}
return mid;
}
int lowbit(int x)
{
return x & (-x);
}
void add(int x, int cnt)
{
for (int i = x; i <= N; i += lowbit(i))
{
tree[i] += cnt;
}
}
LL sum(int x)
{
LL ans = 0;
for (int i = x; i; i -= lowbit(i))
{
ans += tree[i];
}
return ans;
}
int main()
{
int n;
while (~scanf("%d", &n))
{
cnt = 0;
LL ans = 0;
memset(pre, 0, sizeof(pre));
memset(inver, 0, sizeof(inver));
memset(tree, 0, sizeof(tree));
for (int i = 1; i <= n; ++i)
{
scanf("%d", &val[i]);
xis[++cnt] = val[i];
}
sort(xis + 1, xis + 1 + cnt);
cnt = unique(xis + 1, xis + 1 + cnt) - xis - 1;
for (int i = 1; i <= n; ++i)
{
int x = binsearch(val[i]);
add(x, 1);
inver[i] = i - sum(x);
pre[i] = pre[i - 1] + inver[i];
}
memset(tree, 0, sizeof(tree));
for (int i = 1; i <= n; ++i)
{
int x = binsearch(val[i]);
add(x, inver[i]);
ans += pre[i] - sum(x);
}
printf("%lld\n", ans);
}
return 0;
}