ABC 270
Table of Contents
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