ABC 390

B - Geometric Sequence

https://atcoder.jp/contests/abc390/tasks/abc390_b

等比数列の問題

解き方が思いつかなくてテンパった。

$\lfloor \frac{A_{i+1}}{A_i} \rfloor$ を $i = 1\sim N-1$ ですべて一致するか見ようとしたが項比が非整数のときに対応できなくてサンプルでまず落ちる。項比を double で扱ったとしても 999999998 999999999 1000000000 のような数列のときに誤差のせいで $\frac{999999998}{999999999} == \frac{999999999}{1000000000}$ が true を返してしまう。 有理数だったらちゃんと比較できるのだけれどもということを思いついてようやく整数演算で確かめる方法を思いついた。

$\displaystyle \frac{A_{i+1}}{A_{i}} = \frac{A_{i+2}}{A_{i+1}} \rightarrow A_{i+1}^{2} = A_{i} A_{i+2}$ が成り立っているかを確かめればいい

void solve() {
    ll N;
    cin >> N;

    vector<double> v(N);
    rep(i, N) {
        cin >> v[i];
    }

    if (N <= 2) {
        yesno(true);
        return;
    }

    rep(i, N - 2) {
        ll a = v[i], b = v[i + 1], c = v[i + 2];
        if (b * b != a * c) {
            yesno(false);
            return;
        }
    }
    yesno(true);
}

C - Paint to make a rectangle

黒マスがある行番号の最小値、最大値をそれぞれ $i_{\mathrm{ min }}, i_{\mathrm{ max }}$ とし, 黒マスのある列番号の最小値、最大値をそれぞれ $j_{\mathrm{ min }}, j_{\mathrm{ max }}$ とする。

黒マス全体で長方形をなすときの最小の長方形は $i_{\mathrm{min}} \leq i \leq i_{\mathrm{max}}$, $j_{\mathrm{min}} \leq j \leq j_{\mathrm{max}}$ を満たす領域が全て黒マスのときである。よってこの領域に白マスがあれば No, なければ Yes.

void solve() {
    ll H, W;
    cin >> H >> W;

    vector<string> grid(H);
    rep(i, H) cin >> grid[i];

    ll minh = INF, maxh = -1, minw = INF, maxw = -1;
    rep(i, H) {
        rep(j, W) {
            if (grid[i][j] == '#') {
                chmin(minh, i);
                chmax(maxh, i);
                chmin(minw, j);
                chmax(maxw, j);
            }
        }
    }

    int ok = 1;
    for (ll i = minh; i <= maxh; i++) {
        for (ll j = minw; j <= maxw; j++) {
            if (grid[i][j] == '.') {
                ok = 0;
                break;
            }
        }
    }
    yesno(ok);
}

D - Stone XOR

考えられる数の組み合わせの数はおそらく大した数じゃないから全列挙すればいいのだろうとは思ったが、全列挙の仕方がわからなかった。

E - Vitamin Balance

dp の遷移方法が思いつかなかった。