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
求数据中三个位置与大小相反的数有几对
求一个数前面比他大的数的数量 乘 一个数后面比他小的数的数量即为结果。
以前没怎么写过E题。。这应该是E题中为数不多的简单题吧
#include <bits/stdc++.h>
using namespace std;
const int AX = 1e6+666;
struct Node{
int pos;
int val;
}node[AX];
int formerBiger[AX];
int laterSmaller[AX];
int flect[AX];
int c[AX];
int n;
bool cmp(Node a,Node b){
return a.val<b.val;
}
int lowbit(int x){
return x&(-x);
}
void update(int value,int site){
while(site<=n){
c[site] += value;
site += lowbit(site);
}
}
int getsum(int i){
int sum = 0;
while(i>=1){
sum += c[i];
i -= lowbit(i);
}
return sum;
}
int main(){
while(cin>>n){
if(n==0) break;
long long ans = 0;
memset(node,0,sizeof(node));
memset(flect,0,sizeof(flect));
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++){
cin>>node[i].val;
node[i].pos = i;
}
sort(node+1,node+n+1,cmp);
for(int i=1;i<=n;i++){
flect[node[i].pos] = i;
}
for(int i=1;i<=n;i++){
update(1,flect[i]);
formerBiger[i] = i-getsum(flect[i]); //一个数前面比他大的数
}
memset(c,0,sizeof(c));
for(int i=n;i>=1;i--){
update(1,flect[i]);
laterSmaller[i] = getsum(flect[i])-1; //一个数后面比他小的数的数量
}
for(int i=1;i<=n;i++){
ans += (long long)formerBiger[i]*laterSmaller[i]; //这里强制转化一下long long,或者数组就设 //置为long long,不然会WA。
}
cout<<ans<<endl;
}
return 0;
}