B3639 点亮灯笼

· · 题解

我们可以使用一个数组 a 来记录当前所有灯的状态,用 0 表示关闭,用 1 表示打开。数组初值均为 0

接下来,对于每一次操作 x,将 a_{x-1},a_{x},a_{x+1} 全部取反即可。可以通过 1-t \rightarrow t(将 1- 那个数赋值给那个数)的方式取反。

但是由于是环形摆放,需要特判 x=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];
}