Parmida is a clever girl and she wants to participate in Olympiads this year. Of course she wants her partner to be clever too (although he's not)! Parmida has prepared the following test problem for Pashmak.
There is a sequence a that consists of n integers a1, a2, ..., an. Let's denote f(l, r, x) the number of indices k such that: l ≤ k ≤ r andak = x. His task is to calculate the number of pairs of indicies i, j (1 ≤ i < j ≤ n) such that f(1, i, ai) > f(j, n, aj).
Help Pashmak with the test.
The first line of the input contains an integer n (1 ≤ n ≤ 106). The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 109).
Print a single integer — the answer to the problem.
7 1 2 1 1 2 2 1
8
3 1 1 1
1
5 1 2 3 4 5
0
这个代码像谜一样啊,待我再研究几天树状数组再回来看看吧
#include <cmath>
#include <iostream>
#include<cstdio>
#include<map>
using namespace std;
const int MAX=1000017;
int n;
int a[MAX],c[MAX],f[MAX];
long long res;
map<int,int>freq;
int lowbit(int x)
{
return x&(-x);
}
void add(int i,int x)
{
while(i<=n){
c[i]+=x;
i+=lowbit(i);
}
}
int sum(int x)
{
int sum=0;
while(x>0){
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=n-1;i>=0;i--)
f[i]=++freq[a[i]];
freq.clear();
for(int i=0;i<n;i++){
res+=i-sum(f[i]);
add(++freq[a[i]],1);
}
printf("%I64d\n",res);
return 0;
}