xryuseix’s diary progress

イベント参加記とか,何か進捗でたら書きます

ICPC 2021 国内予選 参加記

今年も参加してきました〜!!(@huskyB4llと@sosamjayo) f:id:xryuseix:20211106000100p:plain

www.yamagula.ic.i.u-tokyo.ac.jp

去年はこちらです

xryuseix.hatenablog.com

コンテスト中の様子

[16:30] 僕「は?サイト繋がらないじゃんwwTwitterみよ〜」

[16:40] 僕「は?B全くわからん.愚直にやっていいんか,なんか上手く判定できる条件あんのかわからん」

[16:55] 僕「B解けたwwwやるだけでしたww」

マクロいっぱいですみませんが,こんなコード書いてました.「変更できるのは列か行か,何列/行目」をペアにしたキューに入れて順に処理してました.

int main() {
    while (1) {
        int h, w;
        cin >> w >> h;
        if (h == 0) break;
        queue<pair<int, int>> q;
        q.push({0, 0});
        vvi v(h, vi(w, INF));
        vi x(w, INF);
        vi y(h, INF);
        x[0] = 0;
        rep(i, h + w - 1) {
            int a, b, c;
            cin >> a >> b >> c;
            v[b - 1][a - 1] = c;
        }
        while (!q.empty()) {
            auto t = q.front();
            q.pop();
            int num = t.se;
            int type = t.fi;
            if (type == 0) {
                // 列を確認
                for (int i = 0; i < h; i++) {
                    if (y[i] != INF) continue;
                    if (v[i][num] == INF) continue;
                    y[i] = v[i][num] - x[num];
                    q.push({1, i});
                }
            } else {
                for (int j = 0; j < w; j++) {
                    if (x[j] != INF) continue;
                    if (v[num][j] == INF) continue;
                    x[j] = v[num][j] - y[num];
                    q.push({0, j});
                }
            }
        }
        bool ans = true;
        rep(i, w) if (x[i] == INF) ans = false;
        rep(i, h) if (y[i] == INF) ans = false;
        YN(ans);
    }
}

この辺りでA担当してたhuskyとsosamjayoがAバグらせ太郎をしてました.

[17:05] husky+sosamjayo「A解けたwww」

この辺りで僕がCを考えてたんですが,"""ヤバさ"""を理解してて困ってました.standingの様子からD狙いに移ります.

[17:10] 僕「Dこれ貪欲で良くね?」

sosamjayoと主に話してて,サンプル2で合わないことがわかります.

[17:15] 僕「Dこれ末尾3つ全探索であとは貪欲で良くね?」

良さそうですが,超怪しいです.saosamjayoとhuskyと三人で本当か検証します.

謎証明により「ヨシ!w」の合図が出ます(※証明間違ってます).提出します→WA

ここからいっぱい嘘解法を考えます.落ちるテストケースが知りたいので,僕作のrimeのようなテストツールを使います.

github.com

(間違えてb_i <= 100だと勘違いしてますが)以下のケースで落ちました...

8
100 8 51 41 30 39 64 16

[18:00] husky「末尾3つ全探索で,末尾3項の(min,max)に含まれる要素は列の中間に,他の要素は前半におけばいいんじゃね?」 要はこんな感じです

8
[100 8] [51 41 30] [39 64 16]
(64-16の範囲外を降順) (64-16の範囲内を降順) (全探索した3つ)

当然のようにダメでした.そのまま嘘を大量に生成してました......

結果

92位でした.C以降が解けなかったのが戦犯です.あーあ.

f:id:xryuseix:20211106000100p:plain

www.yamagula.ic.i.u-tokyo.ac.jp