题解:CF220C Little Elephant and Shifts
__ikun__horro__ · · 题解
Solution
我们先来观察样例 #2:
4
2 1 3 4
3 4 2 1
先求出
| 轮数 \ 数字 | ||||
|---|---|---|---|---|
容易发现,每两轮相邻的操作间,
我们可以用一个
| 轮数 \ 数字 | ||||
|---|---|---|---|---|
这样,我们每一轮只需取出一个最接近
那么每次到底要让哪一个数减去
注意:
Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int n, a[N], b[N], p[N];
multiset<int> mango;
inline void sol() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
p[a[i]] = i;
}
auto calc = [=] (int x) {
return p[b[x]] - x;
};
for (int i = 1; i <= n; i++) {
cin >> b[i];
mango.insert(calc(i));
}
for (int i = 1; i <= n; i++) {
int delta = i - 1;
// for (auto i : mango) {
// cout << i << " ";
// }
// cout << "\n";
// for (auto i : mango) {
// cout << i + delta << " ";
// }
// cout << "\n";
auto it = mango.lower_bound(-delta);
int Min = 0x3f3f3f3f3f3f3f3f;
if (it != mango.end()) {
Min = min(Min, abs(*it + delta));
}
if (it != mango.begin()) {
Min = min(Min, abs(*(--it) + delta));
}
cout << Min << "\n";
it = mango.lower_bound(calc(i));
if (it != mango.end()) mango.erase(it);
mango.insert(calc(i) - n);
// cout << "del " << calc(i) + delta << "\n";
// cout << "add " << calc(i) - n + delta + 1 << "\n";
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
// init();
int T = 1;
// cin >> T;
while (T--) sol();
return 0;
}