题目背景
请尽量在 20min 之内写完题目。这是指「写代码」的时间;「读题」时间不计算在内。
题目描述
有 nn 个灯笼环形摆放。最开始,这些灯笼都是关闭的状态。
操作台上有 nn 个按钮,按下第 xx 个按钮时,会反转灯笼 xx 以及相邻两个灯笼的状态。「反转」是指关闭变成点亮、点亮变成关闭。
举一个例子:如果按下第 55 个按钮,则 44、55、66 号灯笼都会反转;如果按下第 nn 个按钮,则 n-1, n, 1n−1,n,1 这三个灯笼状态反转。这是因为灯笼放置为环形,n-1n−1 和 11 是与 nn 相邻的灯笼。
我们依次按下了一些按钮。你需要编程求出当我们的操作完成后,最终这些灯笼的状态。
输入格式
第一行,两个正整数 n, mn,m,分别表示共有 nn 个灯笼、我们按了 mm 次按钮。
接下来 mm 行,每行一个正整数,表示我们在那一次操作中按下了哪个按钮。
输出格式
仅一行,nn 个整数,依次表示 nn 个灯笼的状态,用空格隔开。以 0
代表灯笼关闭,以 1
代表灯笼点亮。
输入输出样例
输入 #1复制
5 4 1 3 1 2
输出 #1复制
1 0 0 1 0
说明/提示
样例解释
灯笼序列的状态如下:
0 0 0 0 0 # 初始状态
1 1 0 0 1 # 按下 1 之后的状态
1 0 1 1 1 # 按下 3 之后的状态
0 1 1 1 0 # 按下 1 之后的状态
1 0 0 1 0 # 按下 2 之后的状态
因此你应当输出 1 0 0 1 0
。
数据规模与约定
对于 100\%100% 的数据,有 n\leq 1000n≤1000,m\leq 1000m≤1000。
我们可以使用一个数组 aa 来记录当前所有灯的状态,用 00 表示关闭,用 11 表示打开。数组初值均为 00。
接下来,对于每一次操作 xx,将 a_{x-1},a_{x},a_{x+1}ax−1,ax,ax+1 全部取反即可。可以通过 1-t \rightarrow t1−t→t(将 1-1− 那个数赋值给那个数)的方式取反。
但是由于是环形摆放,需要特判 x=1,x=nx=1,x=n。
while(m--) {
int x; scanf("%d", &x);
if(x == 1) a[1] = 1 - a[1], a[2] = 1 - a[2], a[n] = 1 - a[n];
else if(x == n) a[n] = 1 - a[n], a[n - 1] = 1 - a[n - 1], a[1] = 1 - a[1];
else a[x] = 1 - a[x], a[x + 1] = 1 - a[x + 1], a[x - 1] = 1 - a[x - 1];
}