CF1696B NIT Destroys the Universe
作者:互联网
第二次打 cf Global Round。
这个第二题是真的思维,代码极短。
问题分析
本题中的 \(\text{mex}(l,r)\) 操作其实就是一个表象,瞄准最终目的 \(\forall a_i,a_i=0\) 就好办。
显然答案只有 \(3\) 种可能:\(0\),\(1\),\(2\)。下面就来证明一下这个简单明了的答案。
结论证明
\(1^{\circ}\) 答案为 \(0\):显而易见,当初始数列为全 \(0\) 时答案为 \(0\)。
\(2^{\circ}\) 答案为 \(1\):把 \(0\) 想成隔板,中间为平台,若连续平台仅一个,设为 \(a_i\) 到 \(a_j\), 则只需一次操作使 \(l=i,r=j\) 即可。如题例 \(2\):
5
0 1 2 3 4
只需使 \(l=2,r=5\) 一次操作即可。
\(3^{\circ}\) 答案为 \(2\):对于除了以上两种情况,如题例 \(3\):
7
0 2 3 0 1 2 0
只需找到最左最右的非零位置 \(l = 2\) 和 \(r = 6\) 进行操作,置为 \(4\),然后再执行一次 \(l=2\),\(r=6\) 即可将 \(a_2\) 到 \(a_6\) 全部置零即将 \(a\) 序列置零。故答案为 \(2\)。
以此类推,可得其他类似情况答案亦为 \(2\)。
综上所述,答案仅可能为 \(0\),\(1\) 或 \(2\)。证毕。
看到这里,代码就很简单了。
Code
#include <stdio.h>
const int N = (int)1e5 + 5;
int n, a[N];
int main(void) {
int t;
for (scanf("%d", &t); t--; ) {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
int Ans = (a[n] != 0); //末尾值要特殊处理
for (int i = 2; i <= n; ++i)
if (a[i] == 0 && a[i - 1] != 0) ++Ans;
//统一连续平非零平台数
printf("%d\n", Ans > 1 ? 2 : Ans); //运用所证结论
}
return 0;
}
The end. Thanks.
(试探一赞
标签:Destroys,CF1696B,int,scanf,circ,答案,操作,如题,NIT 来源: https://www.cnblogs.com/dry-ice/p/cf1696b.html