CF1918B Minimize Inversions 题解

CF1918B Minimize Inversions

诈骗题,点破一文不值。

交换元素 \(i,j\) 时可能有以下四种情况:

情况一:\(a_i\lt a_j,b_i\lt b_j\),此时总逆序对数加 \(1\)

情况二:\(a_i\gt a_j,b_i\lt b_j\),此时总逆序对数不变。

情况三:\(a_i\lt a_j,b_i\gt b_j\),此时总逆序对数不变。

情况四:\(a_i\gt a_j,b_i\gt b_j\),此时总逆序对数减 \(1\)

分析上面四种情况,发现只要 \(a_i\lt a_j\) 时交换就是不劣的,那么我们只用把每个元素按照 \(a\) 从小到大来排序即可。

#include <bits/stdc++.h>
using namespace std;
struct val
{
	long long a,b;
}a[300000];
long long t,n;
bool cmp(struct val a,struct val b)
{
	return a.a<b.a;
}
 
int main()
{
	scanf("%lld",&t);
	while(t--)
	   {
	   	scanf("%lld",&n);
	   	for(int i=1;i<=n;i++)scanf("%lld",&a[i].a);
	   	for(int i=1;i<=n;i++)scanf("%lld",&a[i].b);
	   	sort(a+1,a+n+1,cmp);
	   	for(int i=1;i<=n;i++)printf("%lld ",a[i].a);
	   	printf("\n");
	   	for(int i=1;i<=n;i++)printf("%lld ",a[i].b);
	   	printf("\n");
	   }
	return 0;
} 
posted @ 2025-02-14 18:33  w9095  阅读(17)  评论(0)    收藏  举报