---
# System prepended metadata

title: CF 1333 A. Little Artem
tags: [每日CF梗題挑戰]

---

# CF 1333 A. Little Artem

:::info
[Link](https://codeforces.com/problemset/problem/1333/A)
:::

:::spoiler 目錄
[toc]
:::

## 題意

給定一個$n\times m$的表格，請在這個表格上塗上黑白兩種顏色，以 B ( Black )、W( White ) 表示，這兩種顏色的關係式必須滿足$B=W+1$。
請以 B、W 代表顏色的形式輸出該表格一組合法的解。總共有$t$組測試資料

## 官解

### 思路

這題只要把最左上的格子塗白色，其他塗黑即為一解。如下所示：
```
WBB...
BBB...
BBB...
...
...
...
```
如此一來$W$始終為$1$；$B$始終為$2$，符合題目要求

### code

```cpp=
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n, m;
    cin >> n >> m;
    string s(m, 'B');
    s[0] = 'W';
    
    for (int i = 0; i < n; ++i) {
        cout << s << "\n";
        if (!i) s[0] = 'B';
    }
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}
```

## 初見解

### 思路

觀察輸入可發現$n, m(2\le n, m\le 100)$ 且 $t(1\le t\le 20)$，首先觀察到的是格子數目最多只會有$200000$格，這樣的量級代表我們不能使用像是$O{(n^2)}$等比線性複雜度差太多的做法。

另外一個可以觀察的地方是，$n, m$最小為$2$，所以可以推測只要在這個最小case構造出一個解，之後再找出一個構造的方法擴充它即可。

而實際嘗試後發現只要按以下方式構造即可得到正解：
```
WBWWW...
BBBBB...
WBBBB...
WBBBB...
.....
.....
.....
```
這是因為只要知道最基礎的case $2\times 2$時，以下解滿足題目關係式
```
WB
BB
```
這之後為了要再度擴充這個解，又得同時維護關係式，可以很直覺地想到只要每次擴充一列/行時，讓黑格數和白格數各加一，關係式變化如下：

$$
B = W + 1\\
\Rightarrow (B+1)=(W+1)+1\\
\Rightarrow B = W + 1
$$

而要達到這樣的效果只要讓每次新增過來的列/行和原解的表格相鄰所有格子同色，如此一來新增的列/行只有自己列/行內有相鄰才會對關係式有貢獻。
而列/行的組成就只要第一格顏色不一樣，其他顏色完全一樣，即可達成所求，也就是白色黑色各加一。

### code

```cpp=
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        if (i == 0) {
            cout << "WB";
            for (int j = 2; j < m; ++j) {
                cout << "W";
            }
        } else if (i == 1) {
            for (int j = 0; j < m; ++j) {
                cout << "B";
            }
        } else {
            cout << "W";
            for (int j = 1; j < m; ++j) {
                cout << "B";
            }
        }
        cout << "\n";
    }
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}
```

###### tags: `每日CF梗題挑戰`