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