ABC 320

https://atcoder.jp/contests/abc320

A. Leyland Number

https://atcoder.jp/contests/abc320/tasks/abc320_a

B. Longest Palindrome

https://atcoder.jp/contests/abc320/tasks/abc320_b

C. Slot Strategy 2 (Easy)

https://atcoder.jp/contests/abc320/tasks/abc320_c

D. Relative Position

https://atcoder.jp/contests/abc320/tasks/abc320_d

E. Somen Nagashi

https://atcoder.jp/contests/abc320/tasks/abc320_e

並んでいる人は id が小さい順で常に並んでいる、列から離れた人は帰ってくる時間が小さい順に並んでいると考えればそれぞれを priority queue で管理すれば問題が解けることがわかる

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

    int n, m;
    cin >> n >> m;

    vll ans(n);
    priority_queue<int, vint, greater<int>> people;

    // time, id
    using P = pair<ll, int>;
    priority_queue<P, vector<P>, greater<P>> tpq;

    rep(i, n) people.push(i);
    rep(i, m) {
        ll t, w, s;
        cin >> t >> w >> s;

        // そうめんが流れてくるまでに列に戻ってくる人を列に戻す
        while (tpq.size() && tpq.top().first <= t) {
            auto [t, id] = tpq.top();
            tpq.pop();
            people.push(id);
        }

        // 列に誰もいなかったら何もしない
        if (people.size() == 0)
            continue;

        auto p = people.top();
        people.pop();
        ans[p] += w;
        tpq.push({t + s, p});
    }

    for (ll x : ans)
        cout << x << '\n';
}

F. Fuel Round Trip

https://atcoder.jp/contests/abc320/tasks/abc320_f

G. Slot Strategy 2 (Hard)

https://atcoder.jp/contests/abc320/tasks/abc320_g