はまやんはまやんはまやん

hamayanhamayan's blog

Grid Components [AtCoder Regular Contest 093 D]

https://beta.atcoder.jp/contests/arc093/tasks/arc093_b

解法

https://beta.atcoder.jp/contests/arc093/submissions/2257474

発想問題。
上半分を全て白に、下半分を全て黒にした盤面を用意する。
これで白の連結成分は1つで黒の連結成分も1つである。
白色の連結成分を増やしたい場合は、全て黒にした盤面に点を1つずつ打っていけば、白の連結成分だけを1つずつ増やせる。
黒の連結成分を増やす場合も同様にやればいい。
以下のコードでは上から順に作っているが、全て塗って、更新していく方が実装は楽そう。

int A, B;
vector<string> S;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> A >> B;
    A--; B--;
 
    {
        string s = "";
        rep(x, 0, 100) s += ".";
        S.push_back(s);
 
        rep(i, 0, 10) {
            int y = 1 + i * 2;
            string s = "";
            rep(x, 0, 50) {
                s += ".";
                if (B) {
                    s += "#";
                    B--;
                }
                else s += ".";
            }
            S.push_back(s);
            s = "";
            rep(x, 0, 100) s += ".";
            S.push_back(s);
        }
    }
    
    {
        string s = "";
        rep(x, 0, 100) s += "#";
        S.push_back(s);
 
        rep(i, 0, 10) {
            int y = 1 + i * 2;
            string s = "";
            rep(x, 0, 50) {
                s += "#";
                if (A) {
                    s += ".";
                    A--;
                }
                else s += "#";
            }
            S.push_back(s);
            s = "";
            rep(x, 0, 100) s += "#";
            S.push_back(s);
        }
    }
 
    int n = S.size();
    printf("%d %d\n", n, 100);
    rep(y, 0, n) printf("%s\n", S[y].c_str());
}