排序问题总结

从 P1781 到 P1059,掌握排序中的比较逻辑与易错细节

Thu May 08 2025
526 字 · 4 分钟

💡 最终 AC 代码(P1781)

CPP
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

struct person{
    int id;
    string num;
};

bool cmp (const person& a,const person& b){
    if(a.num.size()!=b.num.size()){
        return a.num.size()>b.num.size();
    }
    return a.num>b.num;
}

int main(){
    int n;
    cin>>n;
    vector<person> a(n);
    for(int i=0;i<n;i++){
        cin>>a[i].num;
        a[i].id=i+1;
    }
    sort(a.begin(),a.end(),cmp);
    cout<<a[0].id<<endl<<a[0].num;
    return 0;
}

CPP
#include<iostream>
#include<vector>
using namespace std;

static long long t = 0;

void mergeSort(vector<int>& a, vector<int>& b, int l, int r) {
    if (l >= r) return;
    int mid = (l + r) / 2;
    mergeSort(a, b, l, mid);
    mergeSort(a, b, mid + 1, r);
    int i = l, j = mid + 1, k = l;
    while (i <= mid && j <= r) {
        if (a[i] <= a[j]) b[k++] = a[i++];
        else {
            b[k++] = a[j++];
            t += (mid - i + 1); // 💡统计逆序对
        }
    }
    while (i <= mid) b[k++] = a[i++];
    while (j <= r) b[k++] = a[j++];
    for (int p = l; p <= r; p++) a[p] = b[p];
}

int main() {
    int n;
    cin >> n;
    vector<int> a(n), b(n);
    for (int i = 0; i < n; i++) cin >> a[i];
    mergeSort(a, b, 0, n - 1);
    cout << t;
    return 0;
}


Thanks for reading!

排序问题总结

Thu May 08 2025
526 字 · 4 分钟

Comment