题目链接:Codeforces - Pashmak and Parmida’s problem
前后分别扫一遍,就可以求出对于的f值。
然后就变成一个逆序对的问题了。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e6+10;
int n,a[N],fl[N],fr[N],d[N]; unordered_map<int,int> mp; long long res;
inline void add(int x,int v){for(;x<=n;x+=x&(-x)) d[x]+=v;}
inline int ask(int x){int s=0; for(;x;x-=x&(-x)) s+=d[x]; return s;}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) mp[a[i]]++,fl[i]=mp[a[i]]; mp.clear();
for(int i=n;i>=1;i--) mp[a[i]]++,fr[i]=mp[a[i]],add(mp[a[i]],1);
for(int i=1;i<=n;i++){
add(fr[i],-1); res+=ask(fl[i]-1);
}
cout<<res;
return 0;
}