T2 点亮灯笼
题目背景
请尽量在 20min 之内写完题目。这是指「写代码」的时间;「读题」时间不计算在内。
题目描述
有 n n n 个灯笼环形摆放。最开始,这些灯笼都是关闭的状态。
操作台上有 n n n 个按钮,按下第 x x x 个按钮时,会反转灯笼 x x x 以及相邻两个灯笼的状态。「反转」是指关闭变成点亮、点亮变成关闭。
举一个例子:如果按下第 5 5 5 个按钮,则 4 4 4、 5 5 5、 6 6 6 号灯笼都会反转;如果按下第 n n n 个按钮,则 n − 1 , n , 1 n-1, n, 1 n−1,n,1 这三个灯笼状态反转。这是因为灯笼放置为环形, n − 1 n-1 n−1 和 1 1 1 是与 n n n 相邻的灯笼。
我们依次按下了一些按钮。你需要编程求出当我们的操作完成后,最终这些灯笼的状态。
输入格式
第一行,两个正整数 n , m n, m n,m,分别表示共有 n n n 个灯笼、我们按了 m m m 次按钮。
接下来 m m m 行,每行一个正整数,表示我们在那一次操作中按下了哪个按钮。
输出格式
仅一行,
n
n
n 个整数,依次表示
n
n
n 个灯笼的状态,用空格隔开。以 0
代表灯笼关闭,以 1
代表灯笼点亮。
样例 #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\% 100% 的数据,有 n ≤ 1000 n\leq 1000 n≤1000, m ≤ 1000 m\leq 1000 m≤1000。
代码内容
//#include <iostream>
//#include <algorithm>
//#include <string>
//#include <cmath>
//#include <ctime>
#include <bits/stdc++.h>
using namespace std;
//typedef long long ll;
int main()
{
int n,m;
cin>>n>>m;
int arr[n]={0};
int i,j,p;
for(i=0;i<m;i++)
{
cin>>p;
if(p-1==0)
{
if(arr[n-1]==0)
arr[n-1]=1;
else arr[n-1]=0;
for(j=p-1;j<2;j++)
{
if(arr[j]==0)
arr[j]=1;
else arr[j]=0;
}
}
else if(p-1==n-1)
{
if(arr[0]==0)
arr[0]=1;
else arr[0]=0;
for(j=p-2;j<n;j++)
{
if(arr[j]==0)
arr[j]=1;
else arr[j]=0;
}
}
else
{
for(j=p-2;j<p+1;j++)
{
if(arr[j]==0)
arr[j]=1;
else arr[j]=0;
}
}
}
cout<<arr[0];
for(i=1;i<n;i++)
cout<<" "<<arr[i];
return 0;
}