CF1631B

因为题意是由后面复制到前面,那我们就从后往前考虑,

假设最后数组中全是 $x$,

因为最后一个数没有其他数能复制到它,所以 $x = a[n]$,

那我们做如下操作:

每次我们就找到末尾最长的全为 $a[n]$ 的串,设其长度为 $k$,

然后选 $n - 2k + 1 \sim n$,即将 $n - k + 1 \sim n$ 复制到 $n - 2k + 1 \sim n - k$,

由于 $n - k + 1 \sim n$ 全是 $a[n]$,通过刚才的操作,$n - 2k + 1 \sim n$ 也全是 $a[n]$,

可以发现末尾最长段一定是单调递增的,所以用一个数存一下刘好了,

那么我们不断进行以上操作,直到满足要求位置。

上述情况中先不考虑越界问题。

#include <cstdio>
#include <iostream>
using namespace std;

const int maxn = 2e5 + 10;
int a[maxn], sum[maxn]; 

int main() {
    int T; scanf ("%d", &T);
    while (T --) {
        int n; scanf ("%d", &n);
        for (int i = 1; i <= n; ++i) {
            scanf ("%d", &a[i]);
        }
        a[0] = 1e9;
        int ans = 0, res = 1;
        while (res < n) {
            while (a[n - res] == a[n]) res ++;
            if (res == n) break; // 防止越界
            res = 2 * res;
            ans ++;
        }
        printf ("%d\n", ans);
    }
    return 0;
}
posted @ 2022-02-04 15:02  wangzhongyuan  阅读(1)  评论(0编辑  收藏  举报  来源