Codeforces - Pashmak and Parmida's problem

题目链接: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;
}
发布了579 篇原创文章 · 获赞 242 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104280965
今日推荐