洛谷P1966

P1966 [NOIP 2013 提高组] 火柴排队

例题放蓝题还没有题解。。。

点击查看代码
#include<bits/stdc++.h>
using namespace std;

using ll = long long;
const int MOD = 1e8 - 3;

int n;
vector<int> A, B, temp;

ll ans = 0;

void merge_sort(vector<int>& arr, int l, int r) {
    if(l >= r) return;
    int mid = (l + r) / 2;
    merge_sort(arr, l, mid);
    merge_sort(arr, mid + 1, r);
    int i = l, j = mid + 1, k = 0;
    temp.resize(r - l + 1);
    while(i <= mid && j <= r) {
        if(arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
            ans = (ans + mid - i + 1) % MOD;
        }
    }
    while(i <= mid) temp[k++] = arr[i++];
    while(j <= r) temp[k++] = arr[j++];
    for(int t = 0; t < k; t++) arr[l + t] = temp[t];
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    cin >> n;

    A.resize(n);
    B.resize(n);
    vector<int> sortedA(n), sortedB(n);

    for(int i = 0; i < n; i++) {
        cin >> A[i];
        sortedA[i] = A[i];
    }
    for(int i = 0; i < n; i++) {
        cin >> B[i];
        sortedB[i] = B[i];
    }

    sort(sortedA.begin(), sortedA.end());
    sort(sortedB.begin(), sortedB.end());

    for(int i = 0; i < n; i++) {
        A[i] = lower_bound(sortedA.begin(), sortedA.end(), A[i]) - sortedA.begin();
        B[i] = lower_bound(sortedB.begin(), sortedB.end(), B[i]) - sortedB.begin();
    }

    vector<int> pos(n);
    for(int i = 0; i < n; i++) {
        pos[B[i]] = i;
    }

    vector<int> C(n);
    for(int i = 0; i < n; i++) {
        C[i] = pos[A[i]];
    }

    merge_sort(C, 0, n - 1);

    cout << ans << '\n';
    return 0;
}
posted @ 2025-05-20 15:48  Chuan81  阅读(9)  评论(0)    收藏  举报