題解:CF1918B Minimize Inversions

All_Unluck_Beginning發表於2024-04-06

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