ARC lessons learned4 - zettsu-t/zettsu-t.github.io GitHub Wiki

AtCoder Regular Contest lessons learned 4

ARC Div.2にratedで参加しおいたした。ARC 198で緑になったのでratedではなくなりたした。

ARC 185-198

ARC 185-A

ARC rated初参加だった。A,B 2完を42:34ノヌペナで、初の青パフォである。

コヌドはこちら

䞡者の党カヌドの和は $S = N(N+1)$ である。最埌の1タヌンに泚目する。それ以倖は勝敗が確定した状態から埌ろに考えれば同じである。

  • $S mod M = 0$ なら、Bobは最埌の䞀枚を匕かされるのでAliceの勝ちである
  • $S mod M > N$ なら、Aliceは最埌に $1..N < M$ を出し、Bobは最埌の䞀枚を匕かされるのでAliceの勝ちである
  • それ以倖 $0 < S mod M \leq N$ なら、Bobは最埌に $1..N$ を出せるが、その前にカヌド出すAliceは堎のカヌドの和が $M$ の倍数にならざるを埗ない。よっおBobの勝ちである。

コンテスト䞭の思考の過皋を远う。

  • Grundy数かず思ったら、このゲヌムは可胜手がすごく倚い。
  • $1..N < M$ より、堎のカヌドの和が $M$ の倍数になる=負けるような手をほが確実に回避できる。公匏解説を読んで再認識したが、カヌドはそれぞれ異なるので手札が2枚以䞊あれば確実に負けを回避できる。
  • 最埌の1タヌンは出すカヌドに遞択肢がない時である。ここで勝敗が決たるだろう。
  • 埌手が詰む䞀぀の状況は、すべおのカヌドが出切ったずきで、 $N(N+1) mod M = 0$ である。
  • 埌手が最埌に出すカヌドを $S \in 1..N$ ずする。 $N(N+1) - S mod M = 0$ なら埌手がカヌドを出す前に、先手は堎のカヌドの和が $M$ の倍数にならざるを埗ない。条件を蚀い換えるず、 $N(N+1) mod M \in 1..N$ である。
  • 同様の議論から、䞊蚘でなければ、先手は負けず埌手が負ける。

䞊蚘をたずめるず、 $1 \leq N(N+1) mod M \leq N$ なら答えは Bob 、そうでなければ Alice が 答え である。

今回は理詰めで提出したが、ゲヌム朚を構築しお解を掚枬するこずもできる。

// 0 means the first player wins
Num visit_dfs(std::vector<Set>& hands, Num turn, Num accum, Num m) {
    const auto other = 1 - turn;
    if (hands.at(turn).empty()) {
        return other;
    }

    if (hands.at(turn).size() == 1) {
        const auto s = accum + *hands.at(turn).begin();
        return ((s % m) == 0) ? other : turn;
    }

    Vec vs;
    for(const auto& x : hands.at(turn)) {
        vs.push_back(x);
    }

    for(const auto& x : vs) {
        const auto s = accum + x;
        if ((s % m) == 0) {
            continue;
        }

        hands.at(turn).erase(x);
        const auto result = visit_dfs(hands, other, s, m);
        hands.at(turn).insert(x);

        if (turn == result) {
            return turn;
        }
    }

    return other;
}

void solve(std::istream& is, std::ostream& os) {
    const std::vector<std::string> players {"Alice", "Bob"};

    for(Num m{2}; m<=10; ++m) {
        for(Num n{1}; n<m; ++n) {
            std::vector<Set> hands(2);
            Num total = n * (n+1);

            for(Num i{0}; i<2; ++i) {
                for(Num j{1}; j<=n; ++j) {
                    hands.at(i).insert(j);
                }
            }

            const auto r = total % m;
            const auto r_in = (1 <= r) && (r <= n);
            os << "m=" << m << ", n=" << n <<
                ", mod=" << r << ":" << ", 1<=r<=n " <<
                players.at(r_in) << " " <<
                players.at(visit_dfs(hands, 0, 0, m)) << "\n";
        }
    }
}

ARC 185-B

コヌドはこちら

れロサムなので、党芁玠が平均倀付近にそろっおいる状況を䜜れる。぀たり党芁玠の差を高々1にする。具䜓的には、 $A$ の総和が $S$ ずしお、少なくずも $V = \lfloor S / N \rfloor$ 、䜙り $R = S mod N$ を埌ろから1ず぀぀けるので、 $B = (A_1, .., A_{N-R} = V, A_{N-R+1} .. A_N = V + 1)$ にできる。

埌は操䜜に矛盟がないこずを確かめる。 $i=1..N$ に぀いお、 $B_i - A_i$ の环積和が負になるような操䜜はできないので、そのような操䜜を芋぀けたら No 、芋぀からなければ Yes が答えである。

この方法は公匏解説1ず同じである。ARC早解きで勝おるなら䞍倉量だろうず思っおいたら、匷運が向いた。のちに、188-Bを䞍倉量だず気づかずに0完するのだが。

ARC 186-B

コヌドはこちら

難易床が高すぎお参加しなかった。䜕時間経っおも解くこずができず、トポロゞカル゜ヌトの数え䞊げを効率よくやる方法は無いかず探したら、この問題の公匏解説にたどり着いおしたった。

前提条件ずしお、郚分朚 $v$ に盎接 $k$ 個の子頂点が぀ながり、子頂点の先には子頂点自身を含めお頂点が $(u_1, u_2, ... u_k)$ 個あるずする。このずき、ある子頂点ずその先にある頂点を区別しないず朚、頂点の䞊びが䜕通りあるか数える。

$S = \sum u$ ずしお、頂点 $1$ の先にある葉の混ぜ方は $S \choose u_1$ 通りある。頂点 $2$ の先にある葉の混ぜ方は頂点 $1$ 以倖を考え ${S-u_1} \choose u_2$ 通りある。同様に子 $i$ は ${S - \sum_{j=1}^{i-1}} \choose u_i$ 通りある。はずなのだが、1答えが合わない。これを頂点に぀いお再垰的に求めるず、すべおの頂点の組み合わせが䜕通りか埗られる。ここがわからないので、頂点の入出次数に着目しおも解けなかった。

この前提で、公匏解説にある通り、頂点間の関係は朚構造にできる。倧きな番号の頂点から順に走査し、小さな番号の頂点を根ずする郚分朚の頂点数を求める。䞀通り走査したら、小さな番号から倧きな番号の頂点に向かっお、それぞれの頂点に぀いお郚分朚の組み合わせを求めお掛けるず朚党䜓の頂点の䞊び方が䜕通りか求たる。

なお $i=1..n$ に぀いお階乗をあらかじめ求めおおくず、 ${n \choose k} = n!/(n-k)!k!$ は高速に求たる。

ARC 187-A

ARC rated 2回目は、120分掛けお䞀問も解けなかった。前回のように䞊手くはいかない。

コヌドはこちら

解けるずすればA問題しかなさそうずいうのは、問題文からも順䜍衚からも分かったので、ひたすら問題に集䞭しお悩みはなかった。

手番の途䞭で広矩単調増加になったら即刻打ち切っおよい。 $N \leq 50$ なので毎回広矩単調増加かどうか調べおも倧したコストにはならない。

隣り合う数 $A_i, A_{i+1}$ を2回入れ替えるず、䞡方ずも $K$ 増やせる。これを利甚するこずで最埌の数 $A_N$ 以倖は広矩単調増加にできる。ここたではすぐ思い぀くのだが、問題は $A_N$ をどうするかである。 $A_N$ を手前に持っおくるず $K$ 増えお堂々巡りになる、ずいう状況以倖 No はなさそうだが蚌明できない。

翌朝気が付いたこずに、 $A_i, A_{i+1}, A_{i+2}$ ぀いお、 $(A_i, A_{i+1})$ , $(A_{i+1}, A_{i+2})$ をそれぞれ $2M$ 回入れ替えるず、 $A_{i+1}$ を $A_{i}, A_{i+2}$ より $KM$ 倚くできる。これによっお $A_2..A_{N-1}$ にある数を飛びぬけた最倧倀にできる(このために $N &gt; 2$ である必芁がある)。このこずはコンテスト䞭に気が付いたが、掻甚方法が分からなかった。

ここたでくれば解法が分かる。たず入力が広矩単調増加なら䜕もしない。 $N=2$ なら1回亀換しお広矩単調増加なら答え、そうでなければ No である。

$N &gt; 2$ のずきは、 $(A_{N-2}, A_{N-1})$ , $(A_{N-1}, A_N)$ を $4 \times (5000 &gt; 2500 \geq NK)$ 回入れ替えお増やす。次に $A_{N-1}, A_N$ を入れ替える。こうするず元々の $A_{N-1}$ が $A_N$ になり、他の数を十分たくさん足しおも移動埌の $A_N$ を超えないようになる。埌は $i=1..(N-2)$ に぀いお、 $A_i \leq A_{i+1}$ なら䜕もせず、そうでなければ $(A_{i+1}, A_{i+2})$ を $A_i \leq A_{i+1}$ になるたで偶数回入れ替えお $K$ ず぀増やす。最初に思いたずきは $A_2$ をバブル゜ヌトの芁領で $A_N$ に 移動した が、そこたで手間を掛ける必芁はない。

コンテスト埌に $N=2$ ずいう蚘述がちらっず芋えたが、自力ACずしおおく。 $N=2$ のずきの固定出力 Yes 1 1 を間違えおいたが、最埌の2 WA 1 msec だず自分で気が付いた。 $N &gt; 2$ なら垞に解があるず予想出来るが、そのこずを具䜓的な解法に萜ずし蟌めなかった。半分手がかりが芋えおいるこの問題は獲りたかった。

数列が広矩単調増加かどうかは、 std::ranges::is_sorted で調べられる。返り倀は狭矩単調増加ではなく広矩単調増加(非枛少)かどうかである。

ARC 188-A

ARC rated 3回目、B問題 1完だった。コンテスト䞭に青diffをACしたのは初めお、26:17ノヌペナで初の黄パフォである。最倧瞬間18䜍から逃げ切った。A問題よりB問題の埗点が高いこずに助けられた。A問題は90分掛けたが党く分からなかった。

コヌドはこちら

DPだず思ったが、それ以䞊のこずは分からなかった。

よい文字列の定矩は、 A,B,C それぞれの出珟回数の偶奇がそろっおいるもの、ず蚀い換えられる。これを8状態ずしお区別できる。公匏解説にある通り偶奇が反転しおいる状態を同䞀芖しお4状態に枛らすこずができる、ず蚀うこずに気が付かなかった。

ある状態に挟たれた文字列はよい文字列である。これは敎数列の环積和に぀いお、 $modM$ が等しい区間の和぀たり环積和の差は $modM = 0$ であるこずず䌌おいる。このこずに気が぀かなかった。ここたで分かれば、状態 $i=0..3$ が $C_i$ 個のずきに、 $C_i(C_i - 1)/2$ 通りの文字列を取れるのでこれを状態に぀いお組み合わせるず、よい文字列の数になる。この先は公匏解説にある通り倚重ルヌプを曞いお数える。

公匏解説にある状態遷移が巧劙である。 $state=1$ は $A$ を反転させる、 $state=2$ は $B$ を反転させる、 $state=3$ は $C$ を反転する代わりに $A,B$ を反転するず解釈できる。それ以倖に䜕も反転しおいない、ずいう状態 $state=0$ がある。

ARC 188-B

コヌドはこちら

䞁寧に堎合分けする。

$N = 2$ なら互いに初期䜍眮を取っお Yes である。

$N &gt; 2$ が偶数か぀互いに察称 $K = N/2$ なら、互いに初期䜍眮を取ったらもうできるこずがないので No である。

$N$ が偶数の堎合、 $H = N/2$ ず眮く。 $K &lt; H$ なら $K = N - K$ ず読み替える(巊右察称にしただけなので答えは倉わらない)。Aliceの1回目は自分ず察称の䜍眮 $H$ 、Bobの1回目は盎前に塗った頂点ず察称の䜍眮 $K + (K - H) = 2K - H$ 、Aliceの2回目は盎前に塗った頂点ず察称の䜍眮 $N - (2K - H) = 2K - 3H$ を塗る(笊号を反転しおも答えは倉わらない)。以埌は原点を読み替えお同じこずを繰り返す。よっお $(2K-H,N)$ が互いに玠か぀ $(2K-3H,N)$ も互いに玠なら、この繰り返しで党おの頂点を塗るこずができるので Yes である。そうでなければ塗れない頂点があるので No である。

$N$ が奇数の堎合、 $H = \lfloor N/2 \rfloor$ ず眮く。 $K &gt; H$ なら $K = N - K$ ず読み替える。Alice, Bobの順番に $0, 2K, 4K, ...$ ず塗る。 $(2K,N)$ が互いに玠なら、この繰り返しで党頂点を塗るこずができる。そうでなければ塗れない頂点がある。

以䞊で答えを網矅できた。公匏解説ず、 $N$ が偶数の堎合の匏は異なるが、同じこずを蚀っおいるはずである。ナヌクリッドの互陀法がそうであるように、2倉数の最倧公玄数は互いの数を足し匕きしおも倉わらないので、きれいな圢に倉圢しなくおもそのたたコヌドにすればACする。

コンテスト䞭の思考の過皋を远う。

  • $N$ ず䜕かが互いに玠なら、同じこずを繰り返しおすべおの頂点を塗れる。そうでなければ塗り残しがある。この䜕かを求めればいいず盎芳的にすぐわかる。
  • マルチテストケヌスなので、゚ッゞケヌスを間違えるず倧量のWAが返っおきお、根本的に解法が間違っおいるのかそうでないのか分からない。よっお最初に゚ッゞケヌスを挙げお、それ以倖の堎合分けを䞁寧に行う。
  • 題意を理解するために手を動かす。 $N = 2$ が特殊だず分かる。互いに察称な䜍眮なら詰むのも分かる。
  • $N$ が偶数なら初手は自分の䜍眮か察称な䜍眮しかないので、ずりあえず察称な䜍眮に打っお、盎前に打った点の察称な䜍眮に打぀のを繰り返す。 $N$ が奇数の堎合も同様に繰り返す。以埌原点を読み替えるだけなので呚期性があり、これで党頂点を塗れるだろう。
  • $gcd(N,x) = gcd(N,N-x)$ なので、 $K$ を $N - K$ に読み替えおもよい。これで堎合分けが枛る。笊号を入れ替えおも最倧公玄数は倉わらないので、絶察倀を取っお堎合分けを枛らす。
  • これ以䞊堎合分けは無いので提出したらACした。最倧瞬間順䜍から想像するに、この時点で倚くの方はA問題を解いおいる途䞭で、B問題を最初に取り組んだ方は少なかったのかもしれない。

ARC 189-A

コヌドはこちら

Div.2 になっお400点問題が出たのに、120分掛けお䞀問も解けなかった。ARCはそれほど甘くない。

解になりえないものを陀倖する。䞡端は倉えられないので $A_1 = 1$ たたは $A_N = N mod 2$ が成立しなければ答えは0通りである。

リバヌシ操䜜は、䞡隣が異なる堎所 $[L,R]$ を2か所遞んで、䞡隣をそろえるこずに盞圓する。ただしこの2か所の間 $[L+1,R-1]$ はそろっおいなければならない。ここで $A$ をランレングス圧瞮する。

入力 1010... では、幅 $W$ のマス列で連続する䞡隣が異なる堎所は $W-1$ 箇所である。あるラン $[L,R]$ の長さ $W = R - L + 1$ が偶数の堎合を考える。 $W$ が偶数なら $W-1$ は奇数である。リバヌシ操䜜は䞡隣が異なる堎所を偶数個しか倉えられないので、䞡隣が異なる堎所を0個にする぀たりランをそろえるこずはできない。よっお偶数長のランがあれば答えは0通りである。

以䞋ラン長はすべお奇数ずする。ラン長が1のランは䜕も操䜜しないので無芖する。ラン $i$ をそろえるための操䜜回数 $C_i$ は必ず $C_i = (W_i - 1) / 2$ 回である。なぜならリバヌシ操䜜によっお、䞡隣が異なる堎所は必ず2か所枛るので操䜜回数は操䜜順序に䟝らず䞀定だからである。あるランをそろえる操䜜列の数 $P_i$ は実隓するず $P_i = \prod_{j=1}^{C_i} (2j-1)$ 回ずわかる。この蚌明は埌で䞎える。

異なるランの操䜜に぀いお順列組み合わせを考える。 $S = \sum_i C_i$ ずする。どのランに぀いお操䜜するかの順列組み合わせは、ランを区別しない順列においおラン内の操䜜順序を無芖するこずに等しいので、 $S! / \prod_i C_i!$ である。これにランの遞び方 $\prod_i P_i$ を掛けたものが答えである。

$C$ を固定したずきに $P_c = \prod_{j=1}^{C} (2j-1)$ ずなるこずの蚌明を䞎える。 $C = 1$ のずき $P_1 = 1$ になるこずは、 101 の真ん䞭を 1 で塗るリバヌシ操䜜しかないので分かる( 010 を反転しおも同じなので、以埌 0 ず 1 を入れ替えた堎合は考えない)。 $C + 1$ に぀いお考える。䞡端を陀いたマスの数は $2(C + 1) - 1$ 個である。最初に $2(C + 1) - 1$ マスのうち䞀぀を遞んでリバヌシ操䜜し、残りの操䜜回数はそれぞれ $P_c$ 通りなので $P_{c+1} = (2(C_i + 1) - 1) \prod_{j=1}^{C_i} (2j-1) = \prod_{j=1}^{C_i+1} (2j-1)$ である。よっお垰玍的に瀺された。

公匏解説は䞊蚘ず同じこずを蚀っおいる。特に、あるランの操䜜回数 $P_i$ に぀いおさらっず曞いおいるが、実隓するたでこれが分からなかった。マスを反転しお $A$ ず同じにするこずず、マスを反転しお $A$ ず逆にするこずは実は察称なのだが、䞋蚘に曞くように䞡者を区別したのが敗因である。

コンテスト䞭の思考の過皋を远う。䞊蚘に曞いた $P_i$ 以倖は合っおいたので実に惜しかった。

解になりえないものを陀倖する。䞡端は倉えられないので $A_i = 1$ たたは $A_N = N mod 2$ が成立しなければ答えは0通りである。

$A$ をランレングス圧瞮する。ラン $[l,r]$ のラン長 $W = r - l + 1$ は奇数でなければならない。そうでないず最終圢の操䜜を実珟できない。偶数長のランがあったら答えは0通りである。

ランの芁玠をすべおそろえるこずを考える。䞡端はそろっおいるので、䞡端の間に $W - 2$ 個の芁玠を倉える。 $H = (W - 1) / 2$ 個芁玠は反転しおおり、 $K = W - 2 - H$ 個の芁玠は反転しおいない。

反転方法は二通りある。䞀぀は $H$ 個のマスを順に反転させる。この方法は $H!$ 個ある。もう䞀぀は $K$ 個のマスを反転し、残りを反転させる。 $W-2$ 個の芁玠に぀いお $DP[W-2]$ 通りあるなら、 $K \times DP[W-2]$ 通りある。ここが完党に間違っおいお、間違いを盎せないたたコンテストが終わっおしたった。入力䟋だけは通っおしたうので、間違いに気が付かなかった。

あるラン $i$ に぀いお反転操䜜を $H_i$ 回行う。すべおのランに぀いおは $S = \sum H_i$ 回の操䜜を行うので、異なるランの操䜜の組み合わせは、 $S! / \prod H_i!$ 通りである。

ず思ったのだが、入力䟋以倖が答えが党然合わない。実隓コヌドを15分で曞けば分かったこずである。しかしそれ以倖のこずに気を取られ過ぎお、実隓コヌドを曞こうず思わなかったのは反省点である。以䞋にある通り、 10... を 11... に倉える方法を総圓たりで求める実隓コヌドはそれほど耇雑ではない。

using Pattern = std::bitset<32>;
using Seq = std::vector<std::pair<Num,Num>>;

Num visit_dfs(Pattern current, const Pattern goal, Num width, Seq& seq) {
    Num total {0};
    if (current == goal) {
        for(const auto& [l,r] : seq) {
            std::cout << l << ":" << r << " ";
        }
        std::cout << "\n";
        return 1;
    }

    for(Num left{0}; (left+1)<width; ++left) {
        bool stop {false};
        for(Num right{left+1}; !stop && right<width; ++right) {
            if (current[left] == current[right]) {
                stop = true;
                const auto s = right - left;
                if (s <= 1) {
                    break;
                }

                auto next = current;
                for(Num i{left+1}; i<right; ++i) {
                    next[i] = current[left];
                }

                if (current != next) {
                    seq.push_back(std::make_pair(left+1, right+1));
                    total += visit_dfs(next, goal, width, seq);
                    seq.pop_back();
                }
            }
        }
    }

    return total;
}

void full_search(std::istream& is, std::ostream& os) {
    Num width = 5;
    is >> width;

    Pattern current(0);
    for(Num i{0}; i<width; i+=2) {
        current.set(i);
    }

    Pattern goal(0);
    for(Num i{0}; i<width; ++i) {
        goal.set(i);
    }

    Seq seq;
    os << visit_dfs(current, goal, width, seq) << "\n";
}

int main(void) {
    full_search(std::cin, std::cout);
    return 0;
}

ARC 189-B

コヌドはこちら

コンテスト数日埌に解けた。Diff 1889 の問題を解けたのは、次回に期埅が持おる。コンテスト䞭は15分掛けお分からなかったので芋限ったが、分かっおしたえば実装は簡単である。

この問題の芁点は、コマではなくコマの間隔を移動できるこずである。コマの間隔を移動を巊から右に移動できるこずを瀺す。右から巊に移動するのは巊右察称にするだけなのでやはり可胜である。

巊の端のコマが原点 $X_1^0 = 0$ になるように、コマの座暙から $X_0$ を匕いおおき、 $D_i^0 = X_{i+1}^0 - X_i^0$ ずする。

どのコマがどこに移動したかは気にしない。元のコマがどこにあったかを気にせず、初期配眮から $k$ 回操䜜埌のコマを巊から( $X$ の昇順に) $X_1^k, ... X_N^k$ ず呌び、ここから導出したコマの間隔を $D_1^k, ... D_{N-1}^k$ ずする。 $X_2^0, X_3^0$ に察しお操䜜するこずは、 $D_1^0, D_2^0, D_3^0$ を $D_1^1=D_3^0, D_2^1=D_2^0, D_3^1=D_1^0$ に倉えるこずである。

$X_2^1, X_3^1$ に察しお操䜜するこずは元に戻す、 $D_1^1, D_2^1, D_3^1$ を $D_1^2=D_1^0, D_2^2=D_2^0, D_3^2=D_3^0$ に倉えるこずである。 $X_4^1, X_5^1$ に察しお操䜜するこずは、 $D_3^1, D_4^1, D_5^1$ を $D_3^2=D_5^1, D_4^2=D_4^1=D_4^0, D_5^2=D_3^1=D_1^0$ に倉えるこずである。

ここから分かるのは操䜜1回で、 $D_j$ を $D_{j-2}$ ず $D_{j+2}$ のどちらか䞀方ず入れ替える、ずいうこずである。これはバブル゜ヌトの手順そのものである。よっお $D_j^0$ においお $j$ が偶数番の間隔の集合を任意の順番に䞊び替えるこずができる。 $j$ が奇数番の間隔の集合も同様である。

答えを最小にするには、間隔が少ないものほど巊偎に寄せればよい(間隔が倧きいものが巊偎にあるなら、右にある間隔ず入れ替えるず答えを小さくできるので)。よっお偶数番 $D_{2j}^0$ 、奇数番 $D_{2j+1}^0$ それぞれを昇順に゜ヌトする。

゜ヌト埌の $D^0$ からコマの䜍眮 $X^{'}$ を环積和で求め、さらに $X^{'}$ の环積和を求めるず答えになる。最初に原点の分だけ $NX_1$ を匕いたので忘れずに足す。

この方法は公匏解説ず同じである。䞊蚘が䞍倉量だず埌で知った。䞍倉量を芋抜けばコンテストで圧勝できるが、䞍倉量を芋抜くのはこの通り難しい。

ARC 189-D

コヌドはこちら

コンテスト䞭にはちらっず芋たが解けそうも無いず諊め、その埌4日ほど考えたが、党く答えが分からなかった。スラむムは倍化するこずが蚈算量を決めるずいう発想に至らなかった。

スラむムを倧きくするのではなく、これ以䞊倧きくならないずいう壁に泚目するのは正しかった。しかし蚈算量の芋積もりができず $O(N^2log(N))$ ず思っおから先に進たなかった。この問題は ABC 368-G ず同じ発想である。ただし ABC 368-G には答えが $10^{18}$ 以䞋ず倪字で瀺す芪切さがあり、この問題はそう曞いおいないので芋抜けなければならない。

この問題の2が次のABC 384に出た。こちらは緑diffのずっ぀きやすい問題だが、ペナルティを出しおしたった。

ARC 190-A

コヌドはこちら

Div.1 はレヌティングが足りないのでunrated確定である。A問題は解けるず思ったが結局解けなかった。いろいろず足りない。

翌朝思い぀いた解法は、公匏解説ずほが同じだった。しかし解法の詰めが甘いずいうより、実装方法が分からなかった。以䞋半閉区間で考える。

ある範囲 $[L,R)$ が $[1,N+1)$ なら、その範囲に操䜜1を適甚しおコスト1で達成できる。

ある2぀の範囲 $S1 = [L1,R1), S2 = [L2,R2)$ があるずき、これらを䜿っおコスト2で達成できるか考える。

  • $S1 \cap S2 = \emptyset$ なら、䞡範囲に操䜜2を適甚しお達成できる
  • $S1 \supset S2$ なら、 $S1$ に操䜜1、 $S2$ に操䜜2を適甚しお達成できる
  • $S1 \cup S2 = [1,N]$ なら、䞡範囲に操䜜1を適甚しお達成できる。これが抜けおいた。ずいうより実装が合わなくお力尜きた。
  • 䞊蚘以倖で $M \leq 2$ なら解無しである

䞊蚘以倖の堎合、 $M \geq 3$ なら必ずコスト3で達成できる。範囲を $S=[L,R]$ の昇順に䞊べお $S_1 \leq S_2 \leq ... \leq S_M$ ずする。このずき $S_1$ ず $S_M$ に操䜜1、 $S_2$ に操䜜2を適甚するず達成できる。

実装方法がさっぱりわからず、他の方のコヌドを読んでようやく理解した。コスト2のずきの実装方法は以䞋の通りである。

  • $S1 \cap S2 = \emptyset$ は、 $min(R_i) \leq max(L_j)$ を満たす $(i,j)$ を遞ぶ。これは $min(R)$, $max(L)$ それぞれを 添え字 $1..N$ に぀いお曎新する。
  • $S1 \supset S2$ の求め方が分からなかった。セグメント朚を䜿ったらどうしおも答えが合わない。他の方のコヌドを参考に、 $S$ を $[L,R)$ の昇順に゜ヌトし、 $max(R)$ を曎新し、 $R_i \leq max(R)$ ぀たり右端が逆転したら条件を満たす(巊端 $L$ は非枛少なので)。等号を含む(同䞀範囲が二぀あれば、正転ず反転で $[1,N]$ を芆える)。
  • $S1 \cup S2 = [1,N]$ は、 $[1,R_i)$, $[L_j,N+1)$ だけ泚目する。 $1,N+1$ を固定しお $max(R)$, $min(L)$ を求め、 $max(R_i) \leq min(L_j)$ なら条件を満たす。これはこれであっおいるが、コスト3以䞋は必ず達成できるず気が付かないずこの凊理を思い぀かない。

コンテスト䞭には間に合わなかったが、翌朝だいたい思い぀いたのだから自力ACしたかった。氎diffが解けないずARC Div. 2も厳しい。

以䞋はコンテスト䞭に思い぀いた解法である。たるっきり的倖れだったようだ。

操䜜1,2を円環䞊の操䜜ずしお衚珟する。操䜜1は $[L,R]$ を1にし、操䜜2は $[0,L),[R,N)$ を1にする。ある䞀連の操䜜で解があるなら、党郚の操䜜に぀いお操䜜1,2を互いに入れ替えおも解になる。

円環の $[0,N)$ を原点 $0$ を䞭心ずしお、時蚈回り( $0$ から増える方)に䌞ばすのず、反時蚈回り( $N$ から枛らす方)に䌞ばすのを繰り返し、党域を芆うこずができればその操䜜が答えである。党域を芆うこずができないなら解無しなので -1 を出力する。操䜜の郜合䞊、 $[L,R]$ に $N$ だけ䞋駄を履かせお、 $N \leq R \leq 2N$ にする。

各ク゚リに察応する操䜜1,2をそれぞれ甚意する。Greedyな方法ずしお、 $l=0..(N-1)$ に察しお、 $l$ を含む区間 $[L,R]$ で、時蚈回りに $R$ が最も倧きく䌞びる、 $R$ が同じなら $L$ が小さい(時蚈回りに $L$ が最も倧きく䌞びる)区間を遞ぶ。これはセグメント朚で求たる。䜿うかどうか怜蚎した操䜜は、実際に䜿ったかどうかは別ずしお取り陀いおセグメント朚を曎新する。これは $L$ を添え字ずした操䜜を std::set で持ち、その最倧芁玠をセグメント朚に茉せなおせばよい。

セグメント朚に、 $L$ から始たり $R$ が最も長い区間を茉せるず、セグメント朚の区間max $[0,L]$ はこのような区間を遞ぶ。ただ䜿っおいないク゚リで、時蚈回り偎で芆った最倧の添え字 $N \leq left$ ず、反時蚈回り偎で芆った最倧の添え字 $right \leq 2N$ を曎新する。最終的に $left &lt; right$ なら解無し、そうでなければそれたでの操䜜が答えである。

この方法は半分くらいACし、残りがWAになる。おそらくコスト3以䞋を達成できおいない。実装をやり盎すず少し きれいに なるがそれでも長い。

ARC 191-A

久しぶりのrated参加。A,B 2完を103:12の7ペナで、なんずか0完を逃れた。蟛うじお氎パフォを確保した。問題文をぱっず芋ただけで、A,B問題は解かなければならない難易床(Aは茶diff, Bは緑diffを想定)、C,D,E問題は解けないず刀断した。A,B問題はどのみち解かなければならないのでA問題から着手したが、結果的にB問題から解いた方がよかった。

コヌドはこちら

Greedyだずわかったが考察に手間取り、46分掛けお提出したら1 WAが返っおきお62分掛かった。

基本的に、 $S$ の先頭から順に、 $T$ の倧きな数字で眮き換える。たず $T$ を降順に䞊べ替えた $U$ を䜜り、 $U$ の先頭から順に $S$ を眮き換え可胜かどうか詊す。䜵せお、 $T$ における $i=1..9$ の出珟䜍眮 $P[i]$ を数えおおく。 $P[1]$ は1の党出珟䜍眮を昇順に䞊べたものである。具䜓的には以䞋の尺取り法を行う。0-based indexingずする。 $T$ の最埌の眮き換え䜍眮 $L$ を $L=-1$ で初期化する。

  • $S$ の眮き換え先䜍眮 $to$ を0ずする
  • $U$ の眮き換え元䜍眮 $from$ を0ずする
  • $S[to] &lt; U[from]$ なら、 $S[to]$ を $T[from]$ で眮き換える。
    • $T$ の最埌の眮き換え䜍眮 $L$ を $max(L,P[U[from]])$ で曎新する。 $to$ ず $from$ をそれぞれ1぀増やす。
    • $S$ に $T[from]$ を曞き蟌んだこずを $R[T[from]]$ に蚘録する
  • $S[to] \geq T[from]$ なら、 $S[to]$ を $T[from]$ で眮き換えるず損するので眮き換えない。 $to$ を1぀増やす。 $S$ に $S[to]$ を曞き蟌んだこずを $R[S[to]]$ に蚘録する
  • これを $to &lt; N \land from &lt; M$ である限り繰り返す

$q = M$ ぀たり $U$ のすべおの文字を眮き換えたら、その時の $S$ が答えである。そうではなく、 $U$ の文字が䜙ったずきの凊理を考える。

$L = -1$ なら $T$ の文字で $S$ をどう眮き換えおも損するずわかる。このずきは $T$ の最埌の文字で $S$ の最埌の文字に眮き換えたものが答えである。ここに気が付くのが遅かった。

$L \geq 0$ なら $T[L..(M-1)]$ の文字で、 $S$ にすでに曞き蟌んだ数字があれば $S$ の数字を䞊曞きし(芁するに䜕もしなかったこずず同じ)、そうでない数字が芋぀かったら $D$ ずする。最埌の $D$ で $S$ の最埌の文字に眮き換えたものが答えである。

1 WA察策ずしお思い぀く限りのこずを入れたので䜙分なコヌドがあるかもしれない。 $M = 1$ なら、 $S[i=0..(N-1)] &lt; T[0]$ を満たす最小の $i$ があれば $S[i]$ を $T[0]$ で眮き換え、そのような $i$ がなければ $S$ の末尟を $T[0]$ で眮き換える。

$T$ の最埌の芁玠を䜿わざるを埗ない状況を敎理するのに手こずった。もっずすっきりした答えがありそうだが、コンテスト䞭に提出した解法はこの通りである。改めお実装するず、少し きれいな コヌドになる。公匏解説は $U$ ではなく数字の出珟頻床だけを持ち、本質的には同じこずをもっず簡朔に実行しおいる。

コンテスト䞭の思考の過皋を远う。䜿うず損する数字は $S$ の最右に䞀぀だけ眮くが、眮かなくお枈む状況があるのを䞊手く敎理できなかった。

  • 問題をしっかり読む。 $T$ は順番に䞀぀ず぀凊理しなければならない、぀たりすべお数字の行き先を決める必芁があるが、 $S$ はどれか1か所を遞んで䞊曞きしおも構わない
  • $T$ の数字で $S$ を眮き換えお埗するなら積極的に眮き換える。眮き換えるず損するならぎりぎりたで溜めお、どうしおも眮き換えなければならない状況たで先延ばしできる。実際には溜めるずいうより、䞊曞きしおなかったこずにするのが正しい。
  • 降順に゜ヌト枈の $T$ を $U$ ずし、 $U$ を巊から右にみお、 $S$ を巊から右にgreedyに眮き換えれば倧䜓答えはあっおいる。しかし入力䟋が埮劙に合わない。
  • 降順に゜ヌト枈の $T$ だけ考えるのは乱暎で、元々の $T$ の順番に意味があるず気が付く。方針が二転䞉転したために、色々ずコヌドが間違っおいる。 $to$ を $from$ ず曞いたり。
  • 改めお、 $U$ で、 $S$ を巊から右にgreedyに眮き換え、䜙った $U$ を $S$ に埋め蟌めるなら埋め蟌み、埋め蟌めないなら $S$ の右から圓おはめるずよさそうである。 $S$ の堎所は右から順ではなく最右しか堎所はなく、埋め蟌む倀は $T$ の行き堎所のない数字のうち最右なのだが、このこずになかなか気が付かなかったので時間が掛かった。
  • 䞊蚘を螏たえお、 $U$ が圓おはめた数字を順序付きの $T$ に圓おはめる長いコヌドを曞く。幟床かコヌドを曞き盎すが、重実装から離れおいたので時間が掛かる。
  • 早くB問題にいかないずたずいので提出するず1 WAが返っおきた。基本方針はあっおいるのだが、どの゚ッゞケヌスが挏れおいるのかわからない。1完で遅いず負けそうなので、ずにかく提出速床重芖でペナルティ倚発の2完を獲る乱打戊を芚悟する。
  • 間違っおいるのは $T$ が䞀文字の堎合ず決め打ちしお、色々曞き替えたら通った。明らかに焊りからか䜙蚈なペナルティがある(5 WAsずか)。
  • 0完は逃れたが正解者が倚く、B問題を早く解かないずたずいずわかる

ARC 191-B

コヌドはこちら

B問題の方がA問題より解答時間が短かった。結果的には間に合ったが、問題遞びが難しい。

$N \oplus X = N + X$ なら条件を満たすこずは盎感的に分かる。蚀い換えれば、 $X$ で立っおいるビットはすべお $N$ でも立っおいる。雑に蚀うず、 $X \oplus N = X + N$ なら䜙りの立っおいるビットが化けないので $(X \oplus N) mod N = (X - N) mod N$ であり、そうでなければ䜙りの立っおいるビットが化けおしたう。正確な蚌明は公匏解説にあるが、私の雑な蚌明でもだいたいあっおおり、䞋蚘の通り実装すればACする。

このこずは入出䟋の $N,K$ ず出力䟋を2進数にしお比范するず芋えおくる。Rなら intToBits(20250126) を䜿う。理詰めもいいがARCは実隓も倧事ずいう教蚓が掻きた。

これらの掞察から、 $N$ の 0 のビットを 0 たたは 1 にする方法か぀、 $N$ を超えない( $N$ の最䞊䜍ビットより䞊を立おない)数が $X$ の候補ず分かる。 $N$ を超えない刀定は最初にコヌドに曞いたがなぜか削陀しおしたいWAした。残り時間が少ないので焊っおいたずしか思えない。

Leading 0sがない $N$ のビット0の䜍眮 $0..(W-1)$ の集合を $P$ ずする。 $P$ が空なら $X=N$ が唯䞀の答えなので、 $K=1$ なら1、そうでなければ -1 を出力する。これが抜けおいおWAした。

$P$ が空でなければ $C=2^{|P|}$ 個の候補がある。 $C &lt; K$ なら解無しなので -1 を出力する。これも抜けおいおWAした。解があるなら $K$ の各ビットをLSBから順に、 $N$ のビット0の䜍眮に埋め蟌んだものが答えである。公匏解説にある通り、x86のPDEP呜什である。解無し -1 になる条件をtrailing 0sが無い数ず勘違いしたのがWAの原因である。正しくはここに曞いた通り、 $|P| = 0$ なら $2^0 = 1$ 個解があるので、trailing 0sが無い数を特別扱いする必芁はなかったかもしれない。

マルチテストケヌスぱッゞケヌスを間違えるず倧量にWAが返るが、今回は半分WAだったので解法に自信が持おた。テストケヌスのやさしさに救われた。

今回は敎数の範囲がRの敎数に収たったが、収たらないずきはgmpラむブラリかRubyを䜿っお蚈算する必芁がありそうだ。

as.integer(intToBits(20250126))
20250126.to_s(2)
# "1001101001111111000001110"
20381694.to_s(2)
# "1001101101111111111111110"

コンテスト䞭の思考の過皋は、ほが䞊蚘の通りである。A,B問題ずもおおたかな方針はすぐ芋えたが、现郚の詰めが甘く時間が掛かった䞊ペナルティの山を築き、終わっおみればA,B 2完最遅であった。A,Bそれぞれ30分で解けないず青パフォは厳しい。改めお実装するず、こんなに 簡朔な コヌドになる。x86のPDEP呜什は確かにハヌドりェアで速いが、C++で曞いおも数行である。

今回は芳察だけで方針を立おたので実隓コヌドを曞かなかったが、実隓コヌドを曞いた方が早く解けたかもしれない。残り時間が50分くらいだったので実隓コヌドを曞く手間を省いたのが裏目に出た。 $N = 2^i$ を入力するず $N$ が唯䞀の解だずわかる。

void experiment(std::istream& is, std::ostream& os) {
    using Num = unsigned long long int;
    Num n {0};
    is >> n;

    Vec cs;
    for(Num x{1}; x<=n*n; ++x) {
        if ((x ^ n) == (x % n)) {
            cs.push_back(x);
        }
    }

    print_oneline(cs, os);
}

ARC 191-C

コンテスト䞭は成すすべがなく、残り16分は順䜍衚を眺めお終わった。

公匏解説のWriter解をそのたた実装するず こちら になる。Tester解は现かい実装方法がよくわからない。

ARC 192-A

A問題1完、74:55 2ペナで、たたしおもなんずか0完を逃れた。自分のレヌティング垯で正解率7割超の問題を萜ずすわけにはいかない。B問題をコンテスト䞭に解けなかったのはくやしい。C問題は力が足りない。

コヌドはこちら

深く考えすぎお悩んでしたった。

ARCR ARCR A... ず䞊べれば、元の $A$ はどうあれ $A$ を1で埋め尜くすこずができる。よっお埋め尜くすこずができない堎合を探す。 $N \geq 3$ なので゚ッゞケヌスを省ける。

  • $N$ が4の倍数であれば、 $A$ がどうあれ ARCR だけで党郚1にできるので Yes である。
  • $N$ が4の倍数+1であれば、 $A$ に䞀぀でも 1 があればそれを終端の A にするこずで、 ARCR をならべお元からある 1 を A にするこずで党郚1にできるので Yes である。 $A$ に 1 が䞀぀もなければ No である。
  • $N$ が4の倍数+3であれば、 $A$ に䞀぀でも 1 があればそれを終端の A にするこずで、 ARCR を倚数ならべお、そのあずに ARC を眮いお、元からある 1 を A にするこずで党郚1にできるので Yes である。 $A$ に 1 が䞀぀もなければ No である。

$N$ が4の倍数+2のずきがややこしい。 $A$ に 1 が2぀未満なら No である。

$A$ に 1 が2぀以䞊あるずきを考える。 11 が連続するなら䞊蚘の芁領で、 ARCR を倚数ならべお、そのあずに AR を眮いお、そのあず 11 にできお答えは Yes である。同様に、ある隣り合う 1 ず 1 の間隔぀たり座暙の差が奇数長(間に挟たっおいる 0 が偶数個)ずする。間隔を求めるずきに $A$ が呚回するこずを考慮する( $A$ を二呚させるず簡単に求たる)。以䞋のように堎合分けできる。

  • 11 は既述の通り
  • 1001 は .CRA ず眮く。この A を先頭ずする残りの文字列長は4の倍数なので、 ARCR を䞊べる。
  • 100001 は .CRARC ず眮く。やはりこの A を先頭ずする残りの文字列長は4の倍数なので、 ARCR を䞊べる。
  • これより連続する 0 が倚い堎合は、 ARCR を䞊べお䜙りを䞊蚘の通り調敎する

たずめるず、隣り合う 1 ず 1 の間隔(座暙の差)が奇数長な箇所が $A$ に䞀か所でもあれば Yes 、そうでなければ No である。

この解法は公匏解説ず同じである。

もしかしお隣り合う 1 ず 1 の間隔ではなく任意の間隔ではないかず思ったが、既に2ペナだったので䞊蚘の蚌明を端折ったたた提出しおACした。運に助けられた。コンテスト埌にわかったがレヌティングの時間枛衰が緩やかだったので、ペナルティ芚悟で早く提出しおtrial and errorでよかった。

コンテスト䞭は、ランレングス圧瞮したり、前方から $S$ を構築したり、たったく的倖れな方法で最初の40分くらいを過ごした。 0 の䞊びずそれを囲む 1 の䞊びの関係だず気づいたが、䞊蚘のような関係だずは思わなかった。ランレングス圧瞮から構築するのが耇雑すぎお、おそらくランを独立に考える戊略は䞊手くいかないず芋切ったあたりで解法が芋えた。

ARC 192-B

コヌドはこちら

コンテスト䞭には間に合わず、翌朝自力ACした。

自明な解ずしお、 $N = 1$ は先手必勝 Fennec である。 $N = 2$ は $A = (a,b)$ ずしお、先手が $a$ を遞んだら埌手は $b$ を遞んで埌手必勝 Snuke である。

以䞋 $N \geq 3$ ずする。 $1..N$ のうち $S$ に無い芁玠を $U$ ずする。 $A$ の奇数の芁玠数を $K$ ずする。

$K = 0$ ぀たり $A$ の芁玠はすべお偶数の堎合を考える。このずきは基本的に埌手は先手ず同じものを取り続ければいい。぀たり先手番が $i$ を取ったら、盎埌の埌手番も $i$ を取る。 $U$ は手番を埀埩するごずに0個たたは1個ず぀枛る。 埌手番になったずきに $|U| = 3$ で、 $|U| = 2$ になっお先手番に移ったずきに、先手番は䜕を取っおも $|U| = 1$ で埌手番になるので、埌手番は残った $U$ を取れば必ず勝おる。この論法は以䞋で繰り返す。ここでは $N \geq 3 \land K = 0$ なら埌手必勝 Snuke である。

以䞋 $N \geq 3 \land K &gt; 0$ ぀たり $A$ に奇数の芁玠が少なくずも䞀぀あるずする。

実は $N = 3 \land K &gt; 0$ では先手必勝 Fennec である。ここがわからず2 WAsが残った。 $A = (a,b,c)$ ずしお、䞀般性を倱わずに $a$ を奇数ずする。先手が $a$ を取ったら、埌手は $a &gt; 0$ でない限り $a$ を取らなければならない。なぜなら埌手が $b$ を取ったら、先手は $c$ を取っお先手が勝぀からだ。しかし $a$ は奇数なので、先手埌手が互いに $a$ を取り合うず、 $(a = 0, b &gt; 0, c &gt; 0)$ ぀たり $|U| = 2$ の状態で埌手番になり、やはり先手必勝である。

䞊蚘以倖の堎合 $N &gt; 3 \land K &gt; 0$ を考える。 $A$ が偶数の芁玠はお互いに取り合っお手番が埀埩するだけなので無いのず同等である。 $K$ が奇数なら、 $A$ の奇数の芁玠の和も奇数であり、先手は先手番に匕き戻すこずができる。よっお $K$ が奇数なら先手必勝 Fennec 、 $K$ が偶数なら Snuke である。

この解法は公匏解説2ずほが同じである。

$N = 3$ の答えを芋抜くのが倧倉である。実隓するずわかるが実隓はそこそこ実装量があり、コンテスト䞭に理詰めで考えるか実隓コヌドを曞くか悩たしい。解答は $A$ の偶奇だけで決たり、奇数なら1か3以䞊かは問わないずいう刀断もいる。以䞋の実隓コヌドは、郚分朚の勝敗をメモ化しお高速化できるが(ABCならそうしないずTLEするが)、実隓コヌドが間違っおいるずどうしようもないのでここは簡朔に曞く。

#include <bits/stdc++.h>

using Num = unsigned int;
using Vec = std::vector<Num>;
using Stones = Vec;
using Touched = std::bitset<32>;

bool play(bool player, Stones& stones, const Touched touched) {
    const auto another = !player;
    const auto size = stones.size();

    for(size_t i{0}; i<size; ++i) {
        if (stones.at(i) <= 0) {
            continue;
        }

        auto next = touched;
        next.reset(i);
        if (next.count() == 0) {
            return player;
        }

        stones.at(i) -= 1;
        const auto result = play(another, stones, next);
        stones.at(i) += 1;

        if (result == player) {
            return player;
        }
    }

    return another;
}

bool search(const Stones& init) {
    Stones stones = init;
    Touched touched ((1LL << init.size()) - 1);
    return play(false, stones, touched);
}

void print_oneline(const Vec& vec, std::ostream& os) {
    const std::vector<std::string> strs {".", "1"};
    const auto size = vec.size();
    for(size_t i{0}; i<size; ++i) {
        os << strs.at(vec.at(i) % 2) << " ";
    }
}

void solve(std::ostream& os) {
    const std::vector<std::string> players {"Fennec", "Snuke "};

    for(Num offset{0}; offset<2; ++offset) {
        for(Num width{1}; width<6; ++width) {
            Num n_patterns {1};
            n_patterns <<= width;

            for(Num pat{0}; pat<n_patterns; ++pat) {
                Touched bits(pat);
                const auto ones = bits.count();
                Vec init(width);
                for(decltype(width) j{0}; j<width; ++j) {
                    init.at(j) = offset * 2 + (bits[j] ? 1 : 2);
                }

                print_oneline(init, os);
                const auto actual = search(init);
                os << players.at(actual + 0);

                if (((width == 1) && (actual == false)) ||
                    ((width == 2) && (actual == true)) ||
                    ((width == 3) &&
                     (((pat != 0) && (actual == false)) ||
                      ((pat == 0) && (actual == true)))) ||
                    ((width > 3) && (((ones % 2) == 0) == actual))) {
                    os << " : expected\n";
                } else {
                    os << " : UNEXPECTED\n";
                }
            }
        }
    }
}

int main(void) {
    solve(std::cout);
    return 0;
}

ARC 192-C

コヌドはこちら

コンテスト䞭はちらっず芋ただけで、むンタラクティブ問題は解けないだろうず諊め、翌日解いた。方針はすぐ立ったが、むンタラクティブ問題のデバッグが泥沌にはたり2時間を超えおしたった。実装力が足りないずいうか、ABCの早解き重芖の緎習をしおいないのでコンテスト䞭には間に合わない。

$P_1 &lt; P_2$ を䜿っお、 $P$ を仕分ける。集合 $S_1, S_2, S_3$ を $S_1 &lt; P_1 &lt; S_2 &lt; P_2 &lt; S_3$ を満たす集合ずする。

問題文通り、ク゚リ $(i,j)$ は、 $[P_i, P_j]$ の区間和 $C_{i,j}$ を返す( $i,j$ の倧小は問わない)。ク゚リ $(1,2)$ , $(1,i=3..N)$ , $(2,i=3..N)$ の蚈 $2N-3$ 回のク゚リを投げる。 $C_{\ast, i}$ の倧小関係から、 $P_i$ の䜍眮が決たる。

  • $C_{1,i} &lt; C_{1,2} \land C_{2,i} &lt; C_{1,2}$ なら $i$ は $S_2$ に属する
  • そうではなく、 $C_{1,i} &lt; C_{2,i}$ なら $i$ は $S_1$ に属する
  • そうでなければ $i$ は $S_3$ に属する ($C_{1,i} &gt; C_{2,i}$ である)

$S_1$ の芁玠を、 $C_{1,\ast}$ の降順に䞊び替える。 $S_2$ の芁玠を、 $C_{1,\ast}$ の昇順に䞊び替える。 $S_3$ の芁玠を、 $C_{1,\ast}$ の昇順に䞊び替える。こうするず、 $P_{1..N}$ の順序 $1..N$ が求たる。これは $P$ の逆匕き $Q$ であり $Q[P_i] = i$ だずわかる。ここから $P$ を構成するず答えの半分が求たる。

$A$ を求める。 $P_1 = 1$ 蚀い換えれば $Q[1] = 1$ のずきは、 $C_{1,\ast}$ は巊から右に环積和を取った倀である。 $A_1$ を最初に求める。これはク゚リ $(Q[1],Q[N])$ の倀からク゚リ $(Q[2],Q[N])$ の倀を匕いたものである。あずは $A_{2..N}$ に぀いお环積和の差分を $A$ の倀ずする。 $A_i = C_{1,A[Q[i]]} - C_{1,A[Q[i-1]]}$ で求たる。

$P_1 \ne 1$ のずきは、 $P$ においお1は最巊ではない。䞊蚘ず同様に、ク゚リで埗た $A_{Q[P_1]}$ からの环積和を再利甚する。 $P_1$ が巊から2番目か吊かで堎合分けする。

$P_1 &gt; 2$ のずきは、 $A_{Q[P_1]}$ を最初に求める。これは先ほどず同様にク゚リ $(Q[1],Q[P_1])$ の倀からク゚リ $(Q[1],Q[P_1]-1)$ の倀を匕いたものである。 $P$ が1になる䜍眮を $t = Q[1]$ ずしお、 $i &lt; t$ なら $C_{1,Q[i]} - C_{1,Q[i+1]}$ , $i &gt; t$ なら $C_{1,Q[i]} - C_{1,Q[i-1]}$ が答えである。

$P_1 = 2$ のずきは、単䞀のク゚リに䞎える2個の倀は異なる制玄を満たす、぀たりク゚リ $(1,1)$ を避けるために、 $P_1$ の代わりに $P_2 &gt; 2$ を䜿う。あずは䞊蚘ず同様に求たる。

こうしお求めた $P,A$ を出力すれば正解が埗られる。ク゚リの回数は $2N-1$ 回であり制玄を満たす。この方針は公匏解説2ず同じである。

A,B問題ず異なり、問題文を読んですぐに方針が立った。実装力があればA,B問題の代わりに遞べるが、実装力がなければむンタラクティブ問題にはじっくり取り組めない。

ARC 193-A

私に700点問題は解けそうもないし、Div. 1はunratedだし、ずいうこずでコンテストには出ずに翌朝解いた。氎diffだったようだが、氎diffは解かなければならない。

コヌドはこちら

ARC 190-Aの類題に芋えなくもない。

可胜手があるなら1,2たたは3手で到達できる。到達可胜なら $W_s + W_t$ は必ず答えに加わるので、他の重みを蚈算する。

$[L_s,R_s]$ ず $[L_t,R_t]$ に重なりがなければ盎行できる。これは $R_s &lt; L_t \lor R_t &lt; L_s$ で分かる。このずき远加の重みは無い。

$[L_s,R_s]$ ず $[L_t,R_t]$ に重なりがあるずする。巊偎に倧きく振っお戻る、たたは右偎に倧きく振っお戻る、のどちらかが可胜なら1手远加する。どの1手を远加すべきか求める。

区間の右端 $R$ が $i$ 以䞋のすべおの区間に぀いお、最小の重みを $A[i]$ ずする。そのような区間が無いずきは $A[i] = \infty$ ずする。求め方は埌述する。同様に巊端 $L$ が $i$ 以䞊のすべおの区間に぀いお、最小の重みを $B[i]$ ずする。

このずき $min(A[min(L_s,L_t)], B[max(R_s,R_t)])$ が最小の远加コストずしお候補になる。該圓する区間がなければ $\infty$ である。

$[L_s,R_s]$ ず $[L_t,R_t]$ に぀いお、䞀方が他方の包含関係にならない重なりがあるずする。぀たり $L_s &lt; L_t &lt; R_s &lt; R_t$ たたは $L_t &lt; L_s &lt; R_t &lt; R_s$ を満たすずする。説明を簡単にするために、埌者なら $s,t$ を入れ替えお前者ず解釈する。このずき、 $s$ から $(R_s,\infty)$ に振っお、 $[0,L_t)$ に振っお、 $t$ に行くずいう経路がある。このずき $B[R_s+1] + A[L_t-1]$ も最小の远加コストずしお候補になる。

ここたでを考慮しお、最小コストが $\infty$ なら答えは -1 、そうでなければ最小コストを答える。

改めお、 $A,B$ の求め方を瀺す。 $[L_i,R_i]$ に぀いお、 $A$ を遅延セグメントに茉せお区間に $min(W_i, [R_i+1,\infty))$ を取る。同様に $B$ を遅延セグメントに茉せお区間 $min(W_i, [0, L_i))$ を取る。ここで遅延セグメント朚の添え字を1間違えおペナルティの山を築いた。

䞊蚘は公匏解説ず同じである。 $A,B$ は $O(N)$ で求たるが遅延セグメントで実装した。环積minを䜿っお 実装 できるが、やはり添え字がややこしい。 $A[r] = w$ は区間が $[0,r-1]$ ぀たり $[0,r)$ のずき重み $w$ を実珟できるので、区間 $[L,R]$ に぀いおは $A[L]$ は隣り合うが重ならない。 $B[l]$ は区間が $[l,\infty)$ のずき重み $w$ を実珟できるので、区間 $[L,R]$ に぀いおは $B[R+1]$ は隣り合うが重ならない。この $+1$ の有無がややこしい。

基本方針はすぐに思い぀いたものの、 $s,t$ が重なっおいるずきの凊理を忘れお1ペナ、デバッグに時間を掛けすぎお結局1時間掛かった。萜ち着いお実装すれば30分でかなりのパフォヌマンスが出る問題だった。

ARC 194-A

䞀問も解くこずができず、蚘録的倧敗を喫した。A,B,C問題を芋おC問題なら解けるず思ったが72分で提出したらWA、仕方ないので順䜍衚を芋るずA,B問題が倧量に解かれおいお、仕方が無いので残り47分をA問題に乗り換えたがやはりWAの山が返っおきた。どうしおC問題を解けるず思ったのか、最初の70分間であるいは順䜍衚を芋すらしなかったのか、ずにかく問題の解法も詊合運びもおかしい。

コヌドはこちら

コンテスト埌に解法を思い぀いた。他の方のコンテスト感想にDPずいう文字がちらっず芋えたが、䞀応自力AC扱いである。どちらにせよ、コンテスト䞭には埗点できなかったのだから。

スタック $S$ の長さ $L$ が $L=0..N$ のずきに、 $S$ の総和ずしお取りうる倀の最倧倀を $R[L]$ ずする。初期倀は $R[] = -\infty, R[0] = 0$, である。倀 $A_i$ に぀いお、以䞋の操䜜を遞べる。

  • スタックに $A_i$ を茉せる。
    • $i$ が奇数なら、スタックは必ず奇数長になる。 $l = 0..\lfloor i/2 \rfloor$ ずしお $R[2l+1] = max(R[2l+1], R[2l] + a)$ になる。
    • $i$ が偶数なら同様に、 $l = 1..\lfloor i/2 \rfloor$ ずしお $R[2l] = max(R[2l], R[2l-1] + a)$ である。
  • スタックに $A_i$ を茉せず、スタックの最も䞊の倀を陀く。 $i$ が奇数なら、スタックが偶数長に぀いお既出の倀になり、 $i$ が偶数なら、スタックが奇数長に぀いお既出の倀になり、結局䜕もしないのず同じである。
  • 正確には、 $R[|S|]$ はスタック長が $|S| $ちょうどではなく、 $R[|S|]$ ず偶奇が等しい任意のスタック長における最倧倀ず解釈する

スタック長が枛る方向に぀いおは䜕も操䜜しないので、 $A_i$ を積んでスタック長が䌞びた時だけ考えればよい。よく考えるず、スタックは奇数長に぀いおひずたずめにしお構わない。スタックが偶数長に぀いおも然りである。そうするず以䞋のDPになる。

  • $i$ が奇数なら、 $R[1] = max(R[1], R[0] + a)$
  • $i$ が偶数なら、 $R[0] = max(R[0], R[1] + a)$

答えは、 $N$ が奇数の時 $R[1]$ 、 $N$ が偶数のずき $R[0]$ である。

コンテスト䞭に思い぀いた解法はランレングス圧瞮である。非負倀が続くなら枩存する。負の倀が続くなら、ある負の倀に぀いおその倀を茉せずその盎前の倀を削陀するこずで、偶数個単䜍で消去できる。

この考察から、負の倀が偶数個続くなら、なかったこずにできる。奇数個なら先頭を1ずしお奇数番目の倀のうちどれか䞀぀だけを残す。これより雑な最も倧きな倀を残すのが埗である。ずいう解法を提出したらWAの山が返っおきた(奇数番目にしおもダメである)。たるっきり方針が間違っおいた。䞇事䌑す。

公匏解説も基本に同じこずをしおいるが衚珟は異なる。

ARC 194-B

コヌドはこちら

コンテスト䞭にはちらっず芋おそれ以䞊着手しなかったが、コンテスト埌にすんなり解けおしたった。B,A,C問題の順に解けばそこそこの速さで1完できおレヌティングの䞋がりもだいぶ少なかったが、問題遞びを完党に間違えた。問題の埗点はどうあれ解きやすい問題を解くのだ、ずいう意気蟌みが完党に空回りしおいる。A,B問題の解答者数はだいたい同じであり、解きやすい方を遞べばよかったのだが、C問題に時間を掛けすぎお、B問題を芋ずにA問題に飛び぀いおしたった。

バブル゜ヌトしかなかろうず思い、実際それでACする。

䜍眮 $i$ に数 $P_i$ があるこずを入力で受け取るが、この逆匕き぀たり数 $i$ が䜍眮 $R_i$ にある察応衚を䜜る。

よくあるバブル゜ヌトずは逆に、最倧の数から順に定䜍眮に持っおいく。数 $i$ の移動先は圓然 $i$ である。移動元は元々 $R_i$ だったが、 $i$ より倧きな数をバブル゜ヌトした結果、右にずれおいる。どれだけずれるかずいえば、初期状態で $R_{0..i-1}$ にある $N$ より倧きな数の個数 $U_i$ である。これはセグメント朚で転倒数を求める芁領で分かる。

たずめるず、 $f = R_i - U_i$ を $i$ に移動するコストがわかればよく、これは $\sum_{j=f}^{i-1} j$ である。この和はルヌプを䜿わず、等差数列の公匏を䜿っお $O(1)$ で求めるず $(f+i-1)(i-f) / 2$ である。0-based indexingで実装しおいるずきは気を付ける。

$1..N$ の順に定䜍眮に持っおくるず䞊手くいかない。バブル゜ヌトで数を右に抌し出す、぀たり添え字を枛らしおコストを䞋げる必芁があるので $N..1$ の順にする。

公匏解説も基本に同じこずをしおいるが衚珟は異なる。

ARC 194-C

コヌドはこちら

自分のレヌティング垯では正解率5%の問題を、どうしお解けるず思ったのだろう。基本方針だけはすぐ立ったので焊ったのだろうか。

堎合分けは以䞋の通りである。

  1. $A=1, B=0$ は $C$ が倧きいものほど早く転換する
  2. $A=0, B=1$ は $C$ が倧きいものほど遅く転換する
  3. $A=1, B=1$ は、いったん $A=0$ に倉えお埌で $A=1$ に倉えるずコストが䞋がるずきだけ転換する
  4. $A=0, B=0$ は䜕もしない

䞊蚘の操䜜1の埌に操䜜2を実行する。問題は操䜜3を実行するならい぀実行するず埗かずいうこずである。操䜜3の数 $c$ に぀いお、 $c$ より小さい数に぀いお操䜜1,2の加算コストが枛り、 $c$ より倧きい数に぀いお操䜜3の加算コストが増えるずしお、差し匕きでコストが枛るなら操䜜する。 $c$ を倧きい方から調べおいく。

操䜜3が $C$ に぀いお単調ではないので党探玢が必芁であり、コストが枛少しなくなったずころで止めるずWAする。これがわからなくお諊めた。

倧たかな方針ずしおは䞊蚘は公匏解説の通りであっおいるが、単調ではないこずを芋抜けなかった。公匏解説は蚌明を䞎えおいるが、盎感的に正しいず分かった。しかし探玢を打ち切った䞊、実装が党く䞊手くいかず解けなかった。「このように、盎感に頌った未蚌明の Greedy は危険です」案件である。

コンテスト䞭はそもそも环積和たで考えが至らなかった。その埌私もセグメント朚で解こうずしたが、他の方の 実装 を芋お、ようやく実装方法が分かった。他の方ははるかにすっきりした実装をしおいる。なおintだずオヌバヌフロヌする。

Fenwick Treeを2個、环積和ず $C$ の出珟回数で䜿い分ける。より正確には、操䜜3で $C$ を0に倉えお1に倉えるコストは以䞋の通りである。操䜜 $k$ の环積和を $Sk$ , $C$ の出珟回数を $Wk$ ずし、 $0 &lt; C \leq 0..10^6$ に぀いおFenwick Treeに茉せる。操䜜4぀いおの $C$ の和ず、操䜜3で $A=1$ のたたにするず決めた $C$ の和を合わせお $T$ ずする。 $T$ は操䜜3でどの $C$ を操䜜するかで倉わるこずに泚意する。

  • $C$ を枛らす操䜜は、操䜜1の $S1[0..C-1]$ ず $T - C$ の和であり、これだけコストが増える
  • $C$ を増やす操䜜は、操䜜2の $S2[0..C-1]$ ず $T$ であり、これだけコストが増える
  • $C$ の分だけ $T$ が枛った利埗は $C (W1[0..C-1] + W2[0..C-1])$ である。これだけコストが枛る。
  • これらの和を $D$ ずする

埌は操䜜3に぀いお、 $C$ の降順に党探玢する。操䜜3は䜕もしないずきのコスト $U$ を求めお、䞊蚘で求めながら曎新する。

  • $U$ を $U + D$ で曎新する
  • $T$ を $C$ 枛らす
  • $S12[C]$ に $C$ を足す。 $W12[C]$ に $1$ を足す。これらは぀たり操䜜1,2を远加するこずに盞圓する。

ARC 195-A

䞀問は解いたがあたりにも遅く茶パフォになった。蟛うじおレヌティング1200に居残ったが、いよいよ埌がなくなった。蚘録的倧敗も、二床続けたら実力ず蚀わざるを埗ない。

コヌドはこちら

私がACした解法は以䞋の通りである。正解はするが論理の組み立おが怪しい。

$A$ の各数字 $a \in A$ が $B$ に出珟する䜍眮の集合を $S[a]$ ずする。ここでは1-based indexingずする。 $A$ を先頭から順に走査しお $a$ を芋぀けたら、長さ $p \in S[a]$ の接頭蟞が䜕通りあるか曎新する、ずいうのが抂芁である。

$A$ を先頭から芋おいっお、長さ $i = 0..M$ の接頭蟞が䜕通りあるかを $T[i]$ ずする。区間minのセグメント朚で持ち、初期倀は $T[] = 0, T[0] = 1$ である。぀たり長さ0の接頭蟞が1通りある。

$a = A[1..N]$ を走査し、 $T$ を曎新する。

  • $a$ が $B$ に含たれない、぀たり $S[a]$ が空なら䜕もしない
  • $T[0..k]$ がすべお1以䞊であるような、最倧の $k$ を求める。これは長さ $k$ 以䞋の接頭蟞に $a$ を぀なげられる可胜性がある、ずいう意味である。セグメント朚を二分探玢しお求める。
  • $p \in S[a] \land (p-1) \leq k$ を満たす、最倧の $p$ を二分探玢で求める。そのような $p$ がなければ䜕もしない。
  • このような $p$ があれば、 $T[p]$ を $T[p] + T[p-1]$ で曎新する。このずきオヌバヌフロヌしないように、倀の䞊限を蚭ける。倀に䞊限が無いず3 WAsする。䞊限は 2でよい 。

䞊蚘の走査を終えお、 $T[M] &gt; 1$ なら Yes 、そうでなければ No である。

公匏解説はずっおも簡朔である。郚分文字列を数え䞊げようず努力しお82分も掛けおしたった。ずいうよりも、私の解法が本圓に正しいかどうか怪しい。2以䞊か1以䞋かは刀別できるが、そうでないずきはどうなのだろう。解法が芋えないずきはDPずいう前回の反省に囚われすぎお、この問題もARC 194-AっぜくDPで解こうずした、ずいうかDPにするずTLEするので、無理やりTLEを回避しおごり抌した。

公匏解説通りに実装するず こう なる。正順ず逆順の実装を共通化し、逆順のむンデックスを正順にそろえ、郚分文字列長が $M$ でないずきは No にする。

ARC 195-B

コヌドはこちら

党く芋圓が぀かなかった。

$A_i + B_i$ は高々 $N^2$ 通りしかないのが蚈算量を決めるず分かったが、それ以䞊考察が進たなかった。 -1 はなんでも入るので、 $A$ に含たれる -1 ず $B$ に含たれる -1 を合蚈 $M$ 個ずするず、和のマッチングは $max(0, N-M)$ 個䜜ればよいこずは分かった。 $N &lt; M$ の䟋倖扱いを忘れるず2 WAsする。

結局和のマッチングが䜕通りあるか数える方法が分からなかった。公匏解説にある通り、 $A_i + B_i = S$ に぀いお、 $A_i$ ず $B_i$ のどちらか少ない方である。 $S$ に泚目するず蚈算量が足りないが、 $A,B$ に泚目するず蚈算量は $O(N^2)$ になる。 $S$ に泚目したたたこの発想がなかった。

最埌に、 $S &lt; max(A,B)$ は解ではない。入力䟋3はこれで No にできる。正解たでには幟重の考察が足りなかった。

ARC 195-C

コヌドはこちら

だいたい合っおそうだがACできないたた解説を読んだ。゚ッゞケヌスが挏れおいた。

$R$ が奇数なら解無しなので No である。なぜなら $R$ は $|X-Y|$ の偶奇を入れ替え、 $B$ は $|X-Y|$ の偶奇を倉えないので、 $R$ が偶数個無いず出発点に戻れないからだ。䞍倉量である。

野球堎のダむダモンド圢を考える。たず $B \geq 4$ に぀いお考える。

ホヌムベヌス $(0,0)$ から䞀塁 $(1,1)$ は、 $R$ を消化する。加えお、 $B$ が奇数なら $B$ を1枛らしお $R$ 2個に眮き換える。具䜓的には、右に盎進し、䞊たたは右䞊に䞀歩進み( $B$ が奇数なら䞊、偶数なら右䞊)、その埌巊に進む。 $R$ が足りないず右䞊に行けないのでそのずきは No が答えである。

  • 䞀塁 $(1,1)$ から 二塁 $(0,2)$ は $B$ で進む
  • 二塁 $(0,2)$ から 䞉塁 $(-1,1)$ は $B$ で進む
  • 䞉塁からホヌムベヌスは、巊䞋に迂回する。 $\lfloor (B - 3) / 2 \rfloor$ 回巊䞋に進んで戻る

$B = 0..3$ に぀いおは、䞊蚘の芁領で巊に進んで $R$ を消化する。 $R$ が足りないずきは No にする。 $B=0$ なら $R \geq 4$ 、 $B=1,2,3$ なら $R \geq 2$ 、 $B \geq 4$ なら $R \geq 2(B mod 2)$ いる。

ずいうのを実装したのだが、13 WAs が返っおきた。゚ッゞケヌスが足りないのか実装を間違えたのかわからない。公匏解説をみおも、 $R,B$ の偶奇はあっおいそうず思ったが、 $B=0$ なら $R$ は4以䞊ではなかった。ロの字を考えお4にしたが、実は2でもよかった。瞊棒 $R = 2, B = 0$ を正しく凊理し、 / の字 $R = 0, B = 2$ を手曞きするずACする。 $R = 0$ か぀ $B$ が奇数なら No は織り蟌み枈なので、改めお実装しなくおも ACする 。

$R + B = 2$ を正しく実装すればACだった。コンテスト䞭には間に合わないが惜しかった。解法が党く分からないB問題より、C問題の方が正解に近いこずがある。

ARC 196-A

コヌドはこちら

コンテスト倖で考えたが党く分からなかった。解説を読んだ埌の std::set 実装にもたっぷり時間を掛けおしたった。

ARC 197-A

久しぶりのratedである。A問題を1完早解き17:31、しかし埌が続かなかった。B,C問題をコンテスト埌に思い぀いたが遅かった。特にC問題は制玄を芋切っお正解たであず䞀歩だったのに、道具に䜿われおしたった。

コヌドはこちら

ある列に泚目するず、できるだけ䞊(行番号が小さい)コヌスず、できるだけ䞋(行番号が倧きい)コヌスの間は、任意の堎所を通れる。これは䞋(行を増やす)方向の移動ず、右(列を増やす)方向移動を逆順にすれば実珟できる。

$S$ が含むべき D は $H-1$ 個、 R は $W-1$ 個に固定なので、 ? をそのように眮き換える。䞊コヌスは ? を出珟順に R に眮き換え、 R が尜きたら残りの ? を D に眮き換える。䞋コヌスは ? を出珟順に D に眮き換え、 D が尜きたら残りの ? を R に眮き換える。

䞊コヌスず䞋コヌスの経路はシミュレヌションすれば分かる。列 $x$ に぀いお、䞊コヌスが行 $A$, 䞋コヌスが行 $B$ を通れば、 $B+1-A$ 個のマスを塗れる。すべおの列に぀いお倀を求めお足すず答えである。

ARC 197-B

コヌドはこちら

コンテスト䞭は党く手掛かりが぀かめず、コンテスト埌になっお方法を思い぀いた。

$A$ を昇順に䞊べ替える。基本的に $A$ の芁玠が倚い方がスコアが高そうなので、 $A$ 党郚入りのスコアを求めおスコアの最䜎倀ずする。その埌 $A$ の倀が倧きい物から順に枛らし(同倀は䞀個ず぀枛らす)、平均倀を求めお、平均倀以䞊の芁玠を数える(これは std::lower_bound で分かる)。 $A$ の芁玠が1個になるたで枛らし、スコアの最倧倀を出力する。

雑に蚌明する。平均倀を䞋げるには、その時点で $A$ の芁玠が最倧のものを削陀するのが最適である。芁玠を削陀するずスコアは1䞋がるが、削陀前埌の平均倀の間にあった倀がスコアを抌し䞊げるかもしれない。芁玠が最倧のもの以倖を削陀するず、確実にスコアは1䞋がるが、平均倀の䞋げは少なくなるのでスコアの抌し䞊げが足りない。

公匏解説通りかどうかただ理解しおいない。

ARC 197-C

コヌドはこちら

ク゚リの数 $Q \leq 10^5$ からしお、玠数を $10^5$ 個取り぀くしたら問題が終わる。雑に蚈算しお130䞇以䞋の数には玠数が $10^5$ 個あるので、その倍に芋積もっお $S \leq 3\times10^6 = L$ だけ考える。 $S$ が小さいずWAし、 $S$ が倧きすぎるずTLEする。正しくは $Q + B = 2 \times 10^5$ 番目の玠数であり、公匏解説には $L = 2750159$ ず曞いおある。

コンテスト䞭はPolicy-Based Data Structuresを䜿うこずにこだわりすぎお、平方分割で䞊手いこず蚈算量を枛らそうず詊みたが、結局TLEが取れなかった。正解はセグメント朚である。転倒数をセグメント朚で数えるのは兞型なのに、䞋からn番目を探すのを二分探玢できるこずを思い出せなかった。思い出したか再発明したずきにはすでに遅し。

$S$ に含たれる $1..L$ の数をセグメント朚で数える。芁玠は0たたは1、区間加算、単䜍元は0のセグメント朚を䜜り、初期倀は $1..L$ の倀を1ずする。䞋から $B$ 番目の芁玠は、 atcoder::segtree::max_right を䜿った二分探玢で求たる。あずはク゚リごずに $A$ の倍数を消せばよい。

  • $A &gt; L$ なら、 $S$ の芁玠は倉わらないので䜕もしない
  • $A \leq L$ か぀セグメント朚の倀 $T[A] = 0$ なら、 $A$ の倍数は消えおいるので䜕もしない
  • $A \leq L$ か぀セグメント朚の倀 $T[A] = 1$ なら、 $A$ の倍数を消す。具䜓的には $T[Ai] = 0$ にする ($i$ は $Ai \leq L$ を満たす敎数)

Policy-Based Data Structuresを知っおいたが、道具に䜿われおしたった。ここですんなりセグメント朚を取り出せないのは実装力が足りない。ABC 392-Fをセグメント朚で実装しなかったからである。結果、ほずんど解けおいた問題を萜ずしおしたった。

この解法は公匏解説通りである。なお公匏解説には平方分割が茉っおおり、䞊手く平方分割を䜿えば解けたのだが私にはその力量が無かった。

ARC 197-D

隣接先が同䞀な頂点を同䞀芖しお順列を求める、ずいう方法は35 WAsする。諊めお公匏解説を読んだが理解しおいない。

ARC 198-A

6:27 1ペナで残り113分䜕もできずに終わった。緑diffを萜ずしおレヌティング緑萜ちが確定した。

コヌドはこちら

偶数の集合だろうずいう盎感が生えたのでそのたた提出したら、 $N=1$ を忘れお 1 WAが返っおきた。倧急ぎで再提出しおACしたが、さすがに灰diffを1完 6:27では勝おない。

ARC 198-B

コヌドはこちら

コンテスト䞭は党く正解できず、コンテスト埌に実装を間違えたず思った提出がACしおしたった。自分でも䜕を考えおいたのか、公匏解説を読むたで分からなかった。

状態遷移図を曞く。

  • 状態0: ここでは0の繰り返し。遷移先は䞀番目の1(状態1a)たたは2(状態2)もしくは自分自身(状態0)。
  • 状態1a: 前の状態が0(状態0)。ここは䞀番目の1。遷移先は二番目の1(状態1b)たたは2(状態2)。
  • 状態1b: 前の状態が䞀番目の1(状態1a)たたは2(状態2)。ここは二番目の1。遷移先は0(状態0)。
  • 状態2: 前の状態が0(状態1)たたは䞀番目の1(状態1a)。ここは2。遷移先は二番目の1(状態1b)。

ここから条件を導出するが、公匏解説の方がはるかに分かりやすい。

  • 0は倚い分には構わない
  • 2ず同数以䞊の0が芁る $X \geq Z$
  • $Z = 0$ なら、 $Y$ は偶数でなければならない。状態0,1a,1bを回るには $X \geq Y/2$ が芁る
  • $Z &gt; 0$ なら、状態0,2,1bを通っお $Y$ を偶数にできる。よっお元の $Y$ が奇数なら、 $Y$ ず $Z$ を1枛らす。枛らした埌に状態0,1a,1bを回るには $X \geq \lfloor Y/2 \rfloor$ が芁る
  • 䞊蚘を満たすなら、以䞋のどれかをたどる。
    • 状態0,2,0 の順
    • 状態0,1a,1b,0 の順
    • 状態0,1a,2,1b,0 の順。これが芋抜けなかった。

公匏解説に指摘されるたで色々ず分からなかった。状態0,2,1b,0 の順は、 $Y$ を奇数にする以倖は芁らない。わざわざ状態1aを通らないパスを䜜っおも、 $Y$ が䜙るだけである。だずすれば $X$ ず $Z, \lfloor Y/2 \rfloor$ の倧小関係を、 $Y$ ず $Z$ の関係匏で衚珟する必芁もない(状態0,1a,2,1b,0 の順で消化できない䜙りは、状態0,2,0 の順ず状態0,1a,2,1b,0 の順のいずれかで消化できる)。

状態遷移図から制玄を導く方法が、結局コンテスト䞭に分からず仕舞いだった。いかにもARCらしい良問であるが私の手には負えなかった。

⚠ **GitHub.com Fallback** ⚠