Codeforces Beta Round #57 (Div. 2)E---Enemy is weak(树状数组+离散化)

来源:互联网 发布:华润五丰待遇知乎 编辑:程序博客网 时间:2024/05/01 10:41

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;}
1 0