专栏文章
题解:AT_agc052_e [AGC052E] 3 Letters
AT_agc052_e题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miqeu7gl
- 此快照首次捕获于
- 2025/12/04 03:38 3 个月前
- 此快照最后确认于
- 2025/12/04 03:38 3 个月前
题意:给定两个长度为 的字符串 ,字符集 。现在一次操作可以选择 和 ,使 ,且 。求把 变为 的最小步骤数,可以证明一定有解。
设整数数列 ,使得 , 和 对于 同余,同理定义整数数列 。我们一定可以构造出一组 使得 ,有 。也同理约束 。
我们发现,若操作 ,则 ,此时 。操作可以使 ,操作后仍然满足相邻两数绝对值为 的限制。
通过贪心的证明,我们容易证明 是操作次数的下界。我们考虑最小化该值。

这个问题十分简单,如图,蓝线和橙线分别代表 和 ,那么当我们将蓝线向上移动时, 的部分会将贡献加一,否则则会减一,因此 和 的 的数量越接近,答案越小,这等价于将两者的中位数对齐。然而,我们只能将 整体加 的倍数,且需要保证 和 奇偶性相同,需要注意实现细节。
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e5 + 5;
int n, a[N], b[N], c[100][100], d, ans, p[N], q[N];
string s, t;
signed main(){
cin >> n >> s >> t, s = "@" + s, t = "@" + t;
c['A']['B'] = 1, c['A']['C'] = -1;
c['B']['C'] = 1, c['B']['A'] = -1;
c['C']['A'] = 1, c['C']['B'] = -1;
a[1] = s[1] % 3;
for(int i = 2; i <= n; i++)
a[i] = a[i - 1] + c[s[i - 1]][s[i]];
b[1] = t[1] % 3;
for(int i = 2; i <= n; i++)
b[i] = b[i - 1] + c[t[i - 1]][t[i]];
for(int i = 1; i <= n; i++) p[i] = q[i] = i;
sort(p + 1, p + 1 + n, [](int x, int y){return a[x] < a[y];});
sort(q + 1, q + 1 + n, [](int x, int y){return b[x] < b[y];});
int d = a[p[(n + 1) / 2]] - b[q[(n + 1) / 2]], mn = 1e18;
for(int e = d / 3 * 3 - 18; e <= d / 3 * 3 + 18; e += 3){
if(((b[1] + e) ^ a[1]) & 1) continue;
ans = 0;
for(int i = 1; i <= n; i++)
ans += abs(a[i] - b[i] - e);
mn = min(mn, ans);
}
cout << mn / 2;
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...