バイトの競プロメモ

主に競技プログラミング

F - Flip and Rectangles

Submission #4195664 - AtCoder Regular Contest 081

2*2の時について考えると
黒の合計が偶数の時のみ全てを黒くできるとわかる
また、この領域からなる長方形も全て黒くできる

なぜなら、どのような操作をしても2*2正方形内の黒は偶数個あり
左端と上を黒くした際に全てが黒くなるからである

よって正方形の座標を圧縮すれば最大正方形問題に帰着できる
Submission #4195664 - AtCoder Regular Contest 081

void solve(int n_, vi a_) {
    cin >> H >> W;
    nt(C, H, W);
    S = ctoi(C, '#');
    ma = max(H,W);
    //左上に置く
    rep(h, H) {
        rep(w, W) {
            if (h < H - 1 && w < W - 1) {
                his[h][w] = (S[h][w] + S[h + 1][w] + S[h][w + 1] + S[h + 1][w + 1]) % 2 == 0;
            }
        }
    }
    rep(h, H) {
        rep(w, W) {
            if (h && his[h][w])his[h][w] += his[h - 1][w];
        }
        vp st;
        rep(w, W) {
            int j = w;
            while (s(st) && st.back().S > his[h][w]) {
                P b = st.back();
                int nw = w - b.F;
                int nh = b.S;
                chmax(ma, (nh + 1) * (nw + 1));
                j = b.F;
                st.pop_back();
            }
            st.eb(j, his[h][w]);
        }
    }
    cout << ma << endl;
}