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;
}