ABC274参加記

4完2ペナ93分 2289位

A問題

D言語のreal型の精度を信じて提出。

import std;

void main() {
    real A, B;
    readf("%f %f\n", A, B);

    real res = B / A;
    writefln("%.3f", res);
}

B問題

1行ごとにマスを読み込み、箱が置かれている列をカウントする。

import std;

void main() {
    int H, W;
    readf("%d %d\n", H, W);

    auto res = new int[](W);
    foreach (_; 0 .. H) {
        string C;
        readf("%s\n", C);

        foreach (i, c; C) {
            if (c == '#') ++res[i];
        }
    }

    writefln("%(%s %)", res);
}

C問題

番号$2i$と$2i+1$のアメーバは$A_{i}$の世代$+1$になるので、時系列順に処理していく。

import std;

void main() {
    int N;
    readf("%d\n", N);

    auto A = readln.chomp.split.to!(int[]);

    auto res = new int[](N*2+2);
    res[2..$] = -1;

    foreach (i, a; A) {
        res[(i+1)*2] = res[(i+1)*2+1] = res[a] + 1;
    }

    res.popFront;

    foreach (r; res) r.writeln;
}

D問題

正整数列$A$のうち奇数番目が$x$方向の移動、偶数盤面が$y$方向の移動である。 それぞれの方向毎に最終的に到達可能な座標を求め、入力$x$、$y$が到達可能か判断する。

import std;

void main() {
    int N, x, y;
    readf("%d %d %d\n", N, x, y);

    auto A = readln.chomp.split.to!(int[]);

    auto xMove = A[2..$].stride(2), yMove = A[1..$].stride(2);
    bool[int] xList, yList;
    xList[A[0]] = yList[0]= true;
    foreach (xm; xMove) {
        bool[int] nxt;
        foreach (key; xList.keys) {
            nxt[key-xm] = nxt[key+xm] = true;
        }
        xList = nxt;
    }

    foreach (ym; yMove) {
        bool[int] nxt;
        foreach (key; yList.keys) {
            nxt[key-ym] = nxt[key+ym] = true;
        }
        yList = nxt;
    }

    bool isOK = (x in xList) && (y in yList);
    writeln(isOK ? "Yes" : "No");
}