璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:cf_1918_b
problems
名称Minimize Inversions
题目编号1918B
题目链接codeforces.com/…
来源CodeForces
算法分类排序, 逆序对, 贪心
难易程度容易

Minimize Inversions

想法

单独看任意一对$i,j$即$(a_i, a_j),(b_i, b_j)$,逆序对的数量为$0, 1, 2$。当两数交换时,会发生:

  1. 数量为0的对,交换后会产生2个逆序对
  2. 数量为1的对,交换后数量依旧为1
  3. 数量为2的对,交换后逆序对数量为0

调整的目的是减少逆序,故需要不动没有逆序的对,动有逆序的对。故将$a$序列直接排序,$a$序列中就不存在逆序对,对应的$b$序列中只会存在逆序对数量为$1$的数对。

代码实现

#include<cstdio>
#include<algorithm>
using namespace std;
struct node {
	int a, b;
};
bool cmp(node a, node b) {
	return a.a < b.a;
}
const int N = 2e5+10;
node line[N];
int main() {
	int T;
	scanf("%d", &T);
	while(T--) {
		int n;
		scanf("%d", &n);
		for(int i=1; i<=n; i++) 
			scanf("%d", &line[i].a);
		for(int i=1; i<=n; i++) 
			scanf("%d", &line[i].b);
		sort(line+1, line+1+n, cmp);
		for(int i=1; i<=n; i++)
			printf("%d%c", line[i].a, " \n"[i==n]);
		for(int i=1; i<=n; i++)
			printf("%d%c", line[i].b, " \n"[i==n]);
	}
	return 0;
}
/app/www/public/data/pages/icpc/problems/cf_1918_b.txt · 最后更改: 2024/02/17 15:32 由 温婕莺