题解:AT_arc225_e [ARC225E] Gap Swap (hard)
星图铺就的,未必是归途。但有人循着它,便不算迷路。
下面定义一个数
:::info[书接上回] 以下为本人简单版本的题解。
先说结论,答案等于:
下面定义有效交换为对数对
如果数列非有序时任意有效交换一定存在,那么不断进行有效交换,每个数
下面证明有效交换一定存在。
假设不存在有效交换,说明不存在数对
先说结论,答案等于:
我们尝试对一次有效交换
对于
对于
而最后两项都会归于零。
因此有一个重大发现:两项的差值就是我们的操作次数!因为我们倒着考虑所有操作的话,每进行一次操作,前一项就会比后一项多
:::success[CODE]
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 5e+5 + 5;
int n;
int a[maxn];
struct BIT {
int a[maxn];
inline int lowbit(int x) {
return x & -x;
}
inline void add(int x, int y) {
for (int i = x; i <= n; i += lowbit(i)) a[i] += y;
}
inline int sum(int x) {
int res = 0;
for (int i = x; i; i -= lowbit(i)) res += a[i];
return res;
}
}t;
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
int ans = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
ans += abs(a[i] - i);
}
for (int i = n; i; i--) {
ans -= t.sum(a[i]);
t.add(a[i], 1);
}
cout << ans;
return 0;
}
:::
欢迎找错,欢迎 hack。