1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <bits/stdc++.h> #define int long long using namespace std;
const int N = 1e5 + 10; const int P = 1e8 - 3;
int a[N], b[N], c[N], d[N], n, e[N], cnt; int p[N];
void merge_sort(int *A, int x, int y, int *T, int &cnt) { if (y - x > 1) { int m = x + (y - x) / 2; int p = x, q = m, i = x; merge_sort(A, x, m, T, cnt); merge_sort(A, m, y, T, cnt); while (p < m || q < y) { if (q >= y || (p < m && A[p] <= A[q])) T[i++] = A[p++]; else { T[i++] = A[q++]; cnt += m - p; cnt %= P; } } for (int i = x; i < y; i++) A[i] = T[i]; } }
signed main(void) { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
cin >> n; for (int i = 1; i <= n; i++) cin >> a[i], c[i] = i; for (int i = 1; i <= n; i++) cin >> b[i], d[i] = i;
sort(c + 1, c + n + 1, [&](const int &i, const int &j) -> bool { return a[i] < a[j]; });
sort(d + 1, d + n + 1, [&](const int &i, const int &j) -> bool { return b[i] < b[j]; });
for(int i = 1; i <= n; i++) e[c[i]] = d[i];
cnt = 0; merge_sort(e, 1, n + 1, p, cnt); cout << cnt % P; }
|