ABC 261 F - Sorting Color Balls(逆序对)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABC 261 F - Sorting Color Balls(逆序对)相关的知识,希望对你有一定的参考价值。

ABC 261 F - Sorting Color Balls(逆序对)

若不考虑颜色,求相邻交换完成排序的最小次数就是逆序对数。

证明就是先将最大数移到最后的次数就是逆序对数,然后是次大值、依此类推直到最小值。

若考虑颜色,因此我们对于相同颜色的逆序数减掉即可。

那么答案就是: a n s = t o t r e v e r s e − t o t c o l i ans=tot_reverse-tot_col_i ans=totreversetotcoli

我们先对每种颜色用vector存,然后跑逆序对。

最后再整体跑一边逆序对即可。

逆序对用 B I T BIT BIT 即可。

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,x[N],c[N],tr[N];
vector<int>V[N];
long long rs;
void Ad(int i,int w)
	for(;i;i-=i&-i)tr[i]+=w;

int Qr(int i)
	int rs=0;
	for(;i<=n;i+=i&-i)rs+=tr[i];
	return rs;

int main()
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
		scanf("%d",&c[i]);
		V[c[i]].push_back(i);
	
	for(int i=1;i<=n;++i)scanf("%d",&x[i]);
	for(int i=1;i<=n;++i)
		int l=V[i].size();
		for(int o=0;o<l;++o)
			rs-=Qr(x[V[i][o]]+1);
			Ad(x[V[i][o]],1);
		
		for(int o=0;o<l;++o)Ad(x[V[i][o]],-1);
	
	for(int i=1;i<=n;++i)
		rs+=Qr(x[i]+1);
		Ad(x[i],1);
	
	printf("%lld\\n",rs);
	return 0; 

以上是关于ABC 261 F - Sorting Color Balls(逆序对)的主要内容,如果未能解决你的问题,请参考以下文章

F - Sorting a Matrix(拓扑&缩点)

F - Sorting a Matrix(拓扑&缩点)

AGC014-F Strange Sorting

UVALive - 8086 Substring Sorting (后缀数组+线段树上二分)

CF258D. Little Elephant and Broken Sorting

ES6 - 从对象数组中删除重复项