Joeの精進記録

旧:競プロ練習記録

ABC109

17位!!Ratedコンテストでこんな順位取りたい、、

D - Make Them Even

左上から順に見ていき奇数のマスがあったら右か下に追いやったとしても偶数の数は減らない(追いやる先が奇数か偶数かは関係ない)。

これよりかはかなり難しいですが、この問題を思い出しました。

F - 天使とふすま

こういう問題はすぐ貪欲だと気づきたいですよね。もっと簡単な例だとバブルソートの正当性証明とかと同じ類の問題ですね

#include <bits/stdc++.h>
using namespace std;

int h, w;
int b[500][500];

struct a {
    int y1, x1, y2, x2;
};

vector<a> ans;

int main() {
    cin >> h >> w;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            cin >> b[i][j];
        }
    }
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            if (b[i][j] % 2) {
                if (j != w - 1) {
                    b[i][j] -= 1;
                    b[i][j + 1] += 1;
                    ans.push_back({i, j, i, j + 1});
                    continue;
                }
                if (i != h - 1) {
                    b[i][j] -= 1;
                    b[i + 1][j] += 1;
                    ans.push_back({i, j, i + 1, j});
                    continue;
                }
            }
        }
    }
    cout << ans.size() << endl;
    for (auto a: ans) {
        cout << a.y1 + 1 << " " << a.x1 + 1 << " " << a.y2 + 1 << " " << a.x2 + 1 << endl;
    }
}