和求逆序对差不多,需要先预处理一下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<map>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
typedef long long LL;
#define maxn (int)1e6+5
int A[maxn],c[maxn],b[maxn],s[maxn];
int n;
void add(int x,int d)
{
while(x<=n)
{
s[x]+=d;
x+=(x&-x);
}
}
LL Query(int x)
{
LL sum=0;
while(x>0)
{
sum+=s[x];
x-=(x&-x);
}
return sum;
}
typedef long long LL;
int main()
{
while(~scanf("%d",&n))
{
map<int, int> q;
for(int i=1;i<=n;i++)
{
scanf("%d",A+i);
q[A[i]]++;
b[i]=q[A[i]];
}
q.clear();
memset(s,0,sizeof(s));
for(int i=n;i>=2;i--)
{
q[A[i]]++;
c[i]=q[A[i]];
add(c[i],1);
}
LL ans=0;
for(int i=1;i<n;i++)
{
ans+=Query(b[i]-1);
add(c[i+1],-1);
}
cout<<ans<<endl;
}
}