ABC 421

https://atcoder.jp/contests/abc421

A. Misdelivery

https://atcoder.jp/contests/abc421/tasks/abc421_a

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

    int N;
    cin >> N;

    vector<string> S(N);
    rep(i, N) cin >> S[i];

    int X;
    string Y;
    cin >> X >> Y;
    X--;

    yesno(S[X] == Y);
}

B. Fibonacci Reversed

https://atcoder.jp/contests/abc421/tasks/abc421_b

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

    ll X, Y;
    cin >> X >> Y;

    auto f = [](ll x) -> ll {
        string s = to_string(x);
        reverse(all(s));
        ll ret = stoll(s);
        return ret;
    };

    vll A(11);
    A[1] = X, A[2] = Y;
    rep2(i, 3, 11) {
        A[i] = f(A[i - 1] + A[i - 2]);
    }
    cout << A[10] << endl;
}

C. Alternated

https://atcoder.jp/contests/abc421/tasks/abc421_c

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

    ll N;
    cin >> N;
    string S;
    cin >> S;

    vint A;
    rep(i, N * 2) {
        if (S[i] == 'A') A.push_back(i);
    }

    ll ans = INF;

    // ABAB...
    {
        ll tmp = 0;
        for (int i = 0, j = 0; i < N * 2; i += 2, j++) {
            tmp += abs(A[j] - i);
        }
        chmin(ans, tmp);
    }

    // BABA...
    {
        ll tmp = 0;
        for (int i = 1, j = 0; i < N * 2; i += 2, j++) {
            tmp += abs(A[j] - i);
        }
        chmin(ans, tmp);
    }

    cout << ans << endl;
}

D. RLE Moving

https://atcoder.jp/contests/abc421/tasks/abc421_d

解説 AC

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

    ll rt, ct, ra, ca;
    cin >> rt >> ct >> ra >> ca;

    ll N, M, L;
    cin >> N >> M >> L;
    using P = pair<char, ll>;
    deque<P> S, T;
    rep(i, M) {
        char c;
        ll x;
        cin >> c >> x;
        S.push_back({c, x});
    }
    rep(i, L) {
        char c;
        ll x;
        cin >> c >> x;
        T.push_back({c, x});
    }

    auto same_pos = [&]() -> bool {
        return rt == ra && ct == ca;
    };

    // rt + x*nrt = ra + x*nra => x = (ra - rt) / (nrt - nra)
    // ct + x*nct = ca + x*nca => x = (ca - ct) / (nct - nca)

    map<char, pair<ll, ll>> dir;
    dir['U'] = {-1, 0};
    dir['D'] = {1, 0};
    dir['R'] = {0, 1};
    dir['L'] = {0, -1};

    ll ans = 0;
    while (N) {
        auto [dt, nt] = S.front();
        auto [da, na] = T.front();

        ll advance = min(nt, na);
        if (dt == da) {
            if (same_pos()) {
                ans += advance;
            }
        } else {
            auto [nrt, nct] = dir[dt];
            auto [nra, nca] = dir[da];

            if (nrt - nra == 0) {  // 左右
                ll x = (ca - ct) / (nct - nca);
                if (rt == ra && (ca - ct) % (nct - nca) == 0 && 0 < x && x <= advance) ans++;
            } else if (nct - nca == 0) {  // 上下
                ll x = (ra - rt) / (nrt - nra);
                if (ct == ca && (ra - rt) % (nrt - nra) == 0 && 0 < x && x <= advance) ans++;
            } else {
                ll lx = (ra - rt) / (nrt - nra);
                ll rx = (ca - ct) / (nct - nca);

                if (lx == rx && (ra - rt) % (nrt - nra) == 0 && (ca - ct) % (nct - nca) == 0 && 0 < lx && lx <= advance) ans++;
            }
        }

        {
            auto [nr, nc] = dir[dt];
            rt += nr * advance;
            ct += nc * advance;
        }
        {
            auto [nr, nc] = dir[da];
            ra += nr * advance;
            ca += nc * advance;
        }

        S.front().second -= advance;
        T.front().second -= advance;
        if (S.front().second == 0) {
            S.pop_front();
        }
        if (T.front().second == 0) {
            T.pop_front();
        }

        N -= advance;
    }

    cout << ans << endl;
}

E. Yacht

https://atcoder.jp/contests/abc421/tasks/abc421_e

F. Erase between X and Y

https://atcoder.jp/contests/abc421/tasks/abc421_f

G. Increase to make it Increasing

https://atcoder.jp/contests/abc421/tasks/abc421_g