E. Enemy is weak
5 seconds
256 megabytes
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.
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.
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).
3 3 2 1
1
3 2 3 1
0
4 10 8 3 1
4
4 1 5 4 3
1
题意是找到i > j > k且满足ai < aj < ak的数据的组数。
我们不妨按照中间的数进行考虑,就可以确定x是j的顺序的数的个数,y是j的逆序数的个数,这样的数的组数是x * y
求逆序对数的方法之前已经说过,这里稍作修改从前往后遍历,思想相同。代码如下:
/************************************************************************* > File Name: Enemy_is_weak.cpp > Author: Zhanghaoran > Mail: chilumanxi@xiyoulinux.org > Created Time: 2016年02月04日 星期四 22时18分58秒 ************************************************************************/ #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; long long n; struct node{ long long num; long long pos; }nn[1000010]; long long uu[1000010]; long long tree[1000010]; long long ans; long long aa[1000010]; long long bb[1000010]; long long cc[1000010]; bool cmp(node a, node b){ return a.num < b.num; } void add(long x){ while(x < 1000010){ tree[x] ++; x += x & -x; } } long long check(long x){ long long sum = 0; while(x){ sum += tree[x]; x -= x & -x; } return sum; } int main(void){ cin >> n; for(long long i = 1; i <= n; i ++){ scanf("%I64d", &nn[i].num); nn[i].pos = i; } sort(nn + 1, nn + 1 + n, cmp); for(long long i = 1; i <= n; i ++){ uu[nn[i].pos] = i; } for(long long i = 1; i <= n; i ++){ aa[uu[i]] = check(uu[i]); bb[uu[i]] = i - aa[uu[i]] - 1; cc[uu[i]] = uu[i] - 1 - aa[uu[i]]; ans += cc[uu[i]] * bb[uu[i]]; add(uu[i]); } cout << ans << endl; }
查看原文:http://chilumanxi.org/2016/02/04/codeforces-beta-round-57-div-2-enemy-is-weak/