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;
}

浙公网安备 33010602011771号