ABC 270

https://atcoder.jp/contests/abc270

A. 1-2-4 Test

https://atcoder.jp/contests/abc270/tasks/abc270_a

B. Hammer

https://atcoder.jp/contests/abc270/tasks/abc270_b

C. Simple path

https://atcoder.jp/contests/abc270/tasks/abc270_c

D. Stones

https://atcoder.jp/contests/abc270/tasks/abc270_d

E. Apple Baskets on Circle

https://atcoder.jp/contests/abc270/tasks/abc270_e

自力 AC.

$f(x)$ を $x$ 周したときに食べるりんごの個数が $K$ 未満になるかを判定する関数とすると $f(x) = \text{true}$ となる最大の $x$ が周回できる回数の最大値となる。 この $x$ の値は二分探索で求めることができる。 周回によってりんごの個数は $A_i \leftarrow A_i - \min(A_i, x)$ に変化し、あとは愚直にシミュレーションをすればよい。

void solve() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    ll N, K;
    cin >> N >> K;
    vll A(N);
    rep(i, N) cin >> A[i];

    auto f = [&](ll x) -> bool {
        ll cnt = 0;
        rep(i, N) {
            cnt += min(A[i], x);
        }
        return cnt < K;
    };

    ll ac = 0, wa = INF;
    while (abs(ac - wa) > 1) {
        ll wj = (ac + wa) / 2;
        if (f(wj)) {
            ac = wj;
        } else {
            wa = wj;
        }
    }

    rep(i, N) {
        ll x = A[i];
        K -= min(x, ac);
        A[i] -= min(x, ac);
    }

    int i = 0;
    while (K) {
        if (A[i] > 0) {
            K--;
            A[i]--;
        }
        i++;
    }
    print(A);
}

F. Transportation

https://atcoder.jp/contests/abc270/tasks/abc270_f

G. Sequence in mod P

https://atcoder.jp/contests/abc270/tasks/abc270_g

Ex. add 1

https://atcoder.jp/contests/abc270/tasks/abc270_h