题解:AT_arc182_d [ARC182D] Increment Decrement Again
Priestess_SLG · · 题解
一个比较巧妙的转化是:不考虑取模关系,因为相邻元素不能相等而且更新的时候只能以
固定
corner case 是
namespace lowspeed_song {
mt19937_64 mt(time(0));
inline void init() {
}
int a[N], b[N], c[N];
inline void sol([[maybe_unused]]int __testcase_id, [[maybe_unused]]int __testcase_sum) {
int n, m; cin >> n >> m;
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < n; ++i) cin >> b[i];
if (m == 2) cout << (equal(a, a + n, b, b + n) ? 0 : -1) << '\n';
else { c[0] = b[0];
for (int i = 1; i < n; ++i) {
int dlt = (b[i] - b[i - 1] + m) % m;
if (a[i - 1] < a[i]) c[i] = c[i - 1] + dlt;
else c[i] = c[i - 1] + dlt - m;
} vector<int> vec;
for (int i = 0; i < n; ++i) vec.emplace_back(a[i] - c[i]);
ranges::sort(vec);
vector<int> cand = {vec[n / 2] / m - 1, vec[n / 2] / m, vec[n / 2] / m + 1};
int res = inf;
for (int &o : cand) {
int sum = 0;
for (int i = 0; i < n; ++i) sum += abs(a[i] - c[i] - o * m);
res = min(res, sum);
} cout << res << '\n';
}
}
} // namespace lowspeed_song