每日一题——Ultra-QuickSort

题目

Ultra-QuickSort

题解

这道题本质是求逆序对的个数,用归并思想来做。

参考代码

#include<iostream>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int n;
int a[N],tmp[N];
LL merge_sort(int l, int r){
    if(l == r) return 0;
    int mid = l + r >> 1;
    LL ans = merge_sort(l, mid) + merge_sort(mid + 1, r);
    int i = l, j = mid + 1, k = 0;
    while(i <= mid && j <= r){
        if(a[i] <= a[j]) tmp[k ++] = a[i ++];
        else{
            tmp[k ++] = a[j ++];
            ans += mid - i + 1;
        }
    }
    while(i <= mid) tmp[k ++] = a[i ++];
    while(j <= r) tmp[k ++] = a[j ++];
    for(int i = l, j = 0; i <= r; i ++, j ++) a[i] = tmp[j];
    return ans;
}
int main(){
    while(cin >> n, n){
        for(int i = 1; i <= n; i ++) cin >> a[i];
        cout << merge_sort(1,n) << endl;
    }
    return 0;
}
posted @ 2025-03-15 20:24  PZnwbh  阅读(5)  评论(0)    收藏  举报