传送门:洛谷 Make Equal Again | Codeforces C. Make Equal Again
更佳的阅读体验:CF1931C 题解
简要题意:给定一个有 $n$ 个整数的序列 $a$,可以进行最多一次操作,使 $a_i$ 到 $a_j$ 全部变为 $x$,代价为 $j - i + 1$。求使序列中所有元素相等的最小代价。
注意到,题目中给定了最多一次操作,因此如果序列所有元素不相等,我们必须只用一次操作将整个序列所有元素变为相等。因此,序列中最终的元素一定是 $a_1$ 或 $a_n$。
有了上述结论,我们只要维护 $a_1$ 和 $a_n$ 连续出现的个数即可。如果 $a_1 = a_n$,那么只要取中间的区间长度即可,否则在两侧的区间长度取最小值即可。
#include <iostream>
using namespace std;
const int N = 2e5 + 10;
int t, n, a[N], l, r;
int main() {
scanf("%d", &t);
while (t--) {
l = r = 1;
scanf("%d%d", &n, &a[1]);
for (int i = 2; i <= n; ++i) {
scanf("%d", &a[i]);
if (a[i] == a[i - 1] && l == i - 1) l = i; // 更新左端点
if (a[i] != a[i - 1]) r = i; // 更新右端点
} if (a[1] == a[n]) printf("%d\n", max(r - l - 1, 0));
else printf("%d\n", min(n - l, r - 1));
} return 0;
}