提交时间:2026-06-12 15:40:49
运行 ID: 91396
// 算法竞赛->第4章->4.2 #include <cstdio> #include <queue> #include <algorithm> #define max(a, b) (((a) > (b)) ? (a) : (b)) int n, a[500010], b[500010], ord1[500010], ord2[500010]; int t[500010]; int tmp[500010]; long long cnt; void Merge(int l, int r) { int mid = (l + r) >> 1; int i = l, j = mid + 1, cur = l - 1; while(i <= mid && j <= r) { if(t[i] > t[j]) { tmp[++cur] = t[j++]; cnt += mid - i + 1; } else tmp[++cur] = t[i++]; } while(i <= mid) tmp[++cur] = t[i++]; while(j <= r) tmp[++cur] = t[j++]; for(i = l; i <= r; i++) t[i] = tmp[i]; } void MergeSort(int l, int r) { if (l == r) return; int mid = (l + r) >> 1; MergeSort(l, mid); MergeSort(mid + 1, r); Merge(l, r); } bool cmp1(int x, int y) { return a[x] < a[y]; } bool cmp2(int x, int y) { return b[x] < b[y]; } int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); for(int i = 1; i <= n; i++) scanf("%d", &b[i]); for(int i = 1; i <= n; i++) ord1[i] = i; for(int i = 1; i <= n; i++) ord2[i] = i; std::sort(ord1 + 1, ord1 + n + 1, cmp1); std::sort(ord2 + 1, ord2 + n + 1, cmp2); for(int i = 1; i <= n; i++) t[ord1[i]] = ord2[i]; MergeSort(1, n); printf("%lld\n", cnt % (99999997)); cnt = 0; return 0; }