洛谷P1966
例题放蓝题还没有题解。。。
点击查看代码
#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;
}

浙公网安备 33010602011771号