传送门:洛谷 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;
}
最后修改:2024 年 02 月 16 日
如果觉得我的文章对你有用,请随意赞赏