CF1918B Minimize Inversions
思路
暴力
一个一个的算,复杂度巨大。
数学规律
让逆序最少,也就是让升序更多。我们可以通过多组数据实验,最终我们会发现,将数列 \(A\) 减少一个逆序对,让数列 \(B\) 随着 \(A\) 变化,最多会只会增加一个逆序对。而让 \(A\) 相邻两个数保持升序,\(B\) 相邻两个数保持降序再排序,\(A\) 数列就会增加一个逆序,\(B\) 数列就会减少一个数列,导致不变,所以排序是最好的办法。
代码
#include<bits/stdc++.h>
using namespace std;
int t,n;
struct node{
int a,b;
}q[200005];
bool cmp(node x,node y){
return x.a<y.a;
}
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++)cin>>q[i].a;
for(int i=1;i<=n;i++)cin>>q[i].b;
sort(q+1,q+n+1,cmp);
for(int i=1;i<=n;i++)cout<<q[i].a<<" ";
puts("");
for(int i=1;i<=n;i++)cout<<q[i].b<<" ";
puts("");
}
return 0;
}
标签:node,数列,Minimize,题解,CF1918B,int,逆序
From: https://www.cnblogs.com/AUBSwords/p/18117666