# 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梗題挑戰`