使用归并做法的疑惑
查看原帖
使用归并做法的疑惑
486570
Q9_KKK楼主2022/9/9 10:14
#include <iostream>
#include <algorithm>
using namespace std;

const int maxn = 1e5 + 1;
const int mod = 1e8 - 3;
pair<int, int> a[maxn], b[maxn];

int pos[maxn];
int tmp[maxn];

int c[maxn];

long long ans = 0;

void solve(int l, int r)
{
    if (l == r)
        return;
    else
    {
        int mid = (l + r) >> 1;
        solve(l, mid);
        solve(mid + 1, r);
        for (int i = l, j = mid + 1, k = l; k <= r; ++k)
        {
            if ((j > r) || (i <= mid && c[i] <= c[j]))
            {
                tmp[k] = c[i++];
            }
            else
            {
                ans += mid - i + 1;
                tmp[k] = c[j++];
            }
        }
        for (int i = l; i <= r; ++i)
            c[i] = tmp[i];
    }
}

int main()
{
    int t;
    cin >> t;
    for (int i = 1; i <= t; ++i)
    {
        cin >> a[i].first, a[i].second = i;
    }
    for (int i = 1; i <= t; ++i)
    {
        cin >> b[i].first, b[i].second = i;
    }
    sort(a + 1, a + 1 + t);
    sort(b + 1, b + 1 + t);
    // for (int i = 1; i <= t; ++i)
    // {
    //     int val = a[i].second;
    //     pos[val] = i;
    // }
    // for (int i = 1; i <= t; ++i)
    // {
    //     int val = b[i].second;
    //     c[i] = pos[val];
    // }
   	 //这里我是按照最长公共子序列的那个做法去映射的,根据第一篇题解正确的映射应该是下面的做法,但不知道为什么,求助
    for (int i = 1; i <= t; ++i)
    {
        int t1 = b[i].second;
        int t2 = a[i].second;
        c[t1] = t2;
    }

    // for (int i = 1; i <= t; ++i)
    //     cout << c[i] << ' ';
    // cout << '\n';
    solve(1, t);
    cout << ans % mod << endl;
    return 0;
}
2022/9/9 10:14
加载中...