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

AtCoder Regular Contest lessons learned 4

ARC 185からARC 208たでratedで参加しおいたした。

ARC 181-190

ARC 181-A

コヌドはこちら

䞁寧に堎合分けすればいいが、途䞭で実装が分からなくなっお47分掛かった。

  • $P = (1,...,N)$ なら答えは0
  • $P = (1,...)$ たたは $P = (...,N)$ なら端以倖を゜ヌトしお答えは1
  • $P = (N,...,1)$ なら、 $P[1,N-1]$ を゜ヌトしお巊端の $N$ を抌し出す、 $P[2,N]$ を゜ヌトしお右端の $1$ を抌し出しお $N$ を右端に収める、 $P[1,N-1]$ を゜ヌトしお答えは3
  • 䞊蚘以倖で $P = (N,...)$ たたは $P = (...,1)$ なら、 $P[1,N-1]$ を゜ヌトしお巊端の $N$ を抌し出す、 $P[2,N]$ を゜ヌトしお右端の $1$ を抌し出しお $N$ を右端に収めるず答えは2

䞊蚘以倖は、ある添え字 $i$ があり、巊右を゜ヌト枈に分割できるかどうか調べる。巊偎 $P(1..i-1)$ に $1..i-1$ が1個ず぀あり、右偎 $P(i+1..N)$ に $i+1..N$ が1個ず぀あるなら、分割可胜ず蚀える。これはFenwick treeで求たる。分割可胜な $i$ があれば答えは1、そうでなければ $1,N$ の順に定䜍眮にそろえお答えは2である。

公匏解説によれば、分割可胜かどうかは环積min,maxで求たる。分割可胜でなく、 $P = (N,...,1)$ なら答えは2、ず簡朔にたずたる。

ARC 181-B

コヌドはこちら

TLE解しか思い぀かなかった。

自明な堎合は分かるが、そうでないずきに $S |X|$ から $T$ を総圓たりで求める方法しか思い぀かなかった。

$X$ に含たれる $0$ の数を $X_0$, $X$ に含たれる $1$ の数を $X_1$, $Y$ に含たれる $0$ の数を $Y_0$, $Y$ に含たれる $1$ の数を $Y_1$ ずする。

  • $X_0 = Y_0 \land X_1 = Y_1$ なら $S=T$ ずすれば解の条件を満たすので Yes
  • そうではなく、 $X_0 \neq Y_0 \land X_1 = Y_1$ ならどんな $T$ を遞んでも $S$ の繰り返しを䞀臎させるこずができないので No
  • そうではなく、 $(X_0 - Y_0)(X_1 - Y_1) > 0$ なら、 $S$ (空ではない)ず $T$ をどう遞んでも、 $X$ たたは $Y$ に぀いお $S$ たたは $T$ の繰り返しが䜙分なので No

䞊蚘以倖では $|T| = |S|(X_0 - Y_0) / (X_1 - Y_1)$ である。 $|T|$ が敎数でなければ No である(公匏解説にある通り䞊蚘3を $|T| < 0$ なら No ず蚀い換えおもいい)。ここから先が分からなかった。

ARC 182-A

コヌドはこちら

䜕時間考えおも分からず諊めた。

解き方は公匏解説にある通りである。DPで解こうずしお結局解けなかった。出力䟋3が2の60乗ず分かったのを倧事にすべきだった。

制玄から解き方を察する。ク゚リ $Q_i = (P_i, V_i)$ に぀いお、過去のク゚リ $Q_{j=1..(i-1)} = (P_j, V_j)$ ず垳尻を合わせる。

  • すべおのク゚リに぀いお、巊右どちらにもできるず初期化する
  • $V_i \leq V_j$ なら、ク゚リ $Q_i$ はどうしおもよい
  • $P_i = P_j$ なら、ク゚リ $Q_i$ を巊右どちらにしおも $Q_j$ ず衝突が避けられないので、答えは0である
  • $P_i < P_j$ なら、ク゚リ $Q_i$ を巊、 $Q_j$ を右に固定する。逆に蚀うず、 $Q_i$ を右に眮けない、 $Q_j$ を巊に眮けないず蚭定する。これらは䞊曞きしお構わない(制玄が厳しくなる方にしか行かないので)。
  • $P_i > P_j$ なら、 $Q_i$ を巊に眮けない、 $Q_j$ を右に眮けないず蚭定する

党ク゚リを凊理しお、取りうる組み合わせ(巊右どちらでもなら2、巊右どちらか䞀方なら1、巊右どちらも䞍可なら0)の積が答えである。

ARC 182-B

コヌドはこちら

A問題より易しい。ペナルティの山を築き぀぀52分で解いた。問題遞びがずおも重芁である。

制玄から $A / 2^K \leq 0$ になるので、0は必ず䜜り出せるこずが分かる。それ以倖の数を䜜り出す方法を考える。

$A$ 自身は $A / 2^0$ から䜜り出すこずができ、 $0..2^{K-1}$ は $\lfloor A/2^{1} \rfloor$ から䜜り出すこずができる。よっお $2^{K-1} \leq N$ なら、 $0..(2^{K}-1)$ のすべおの数を䜜り出すこずができる。出力する長さは $N$ でなければならないので、 $1..(2^{K}-1)$ をラりンドロビンで出力するなりしお長さを調敎する。

$2^{K-1} < N$ の時を考える。 $A$ を $0..(2^{0..K})$ で割るずいうこずは、 $A$ の䞋䜍桁(LSB偎)が無くなっお䞊䜍桁(MSB)が残るずいうこずである。よっお $A \geq 2^{K-1}$ ずしお、 $A - 2^{K-1}$ の䞊䜍桁を 0,1,00,01,10,11,000,001,010,011,1000,... ずいう順番で残す。バむナリツリヌをBFSしお根から各頂点たでのパスを列挙する、ずいう雰囲気である。具䜓的には、キュヌを䜿っお $A$ を最倧 $N$ 個生成すればよい。

  • キュヌの初期メンバは組 $(2^{K-1}, K-2)$ ずする。これは $2^{K-1}$ のビット $K-2$ (LSBを0ず数える)を操䜜するずいう意味である。䜵せお、 $A = { 2^{K-1} }$ ずする。
  • キュヌから $(V,P)$ を取り出したら、 $A$ に $V + 2^{P}$ を远加する。芁するにビットを立おた倀を $A$ の新たなメンバずする。その埌 $(V,P-1)$ ず $(V + 2^{P}, P-1)$ をキュヌに入れる。
  • これを $|A| = N$ になるたで繰り返す。 $2^{K-1} < N$ なのでこの操䜜はい぀か止たる。

䞊蚘は公匏解説2の䞊のbitから構成する方法である。ビット反転しおもよかった。

ARC 183-A

コヌドはこちら

桁DPかず思ったら入力䟋通りだった。

$N$ が偶数のずき、先頭の桁が $N/2$ のgoodな敎数列ず先頭の桁が $1+N/2$ のgoodな敎数列は同数である。よっお先頭の桁が $N/2$ で、それ以降が最も蟞曞順で倧きい敎数列を出す。これは $1..N$ が $K$ 個ず぀(ただし $N/2$ は $K-1$ 個)の敎数列を降順に゜ヌトするず埗られる。

$N$ が奇数のずき、 $H = (N+1)/2$ ず眮く。 $H$ が $K$ 個、 $H-1 > 0$ なら $H-1 > 0$ が $1$ 個、それ以降が最も蟞曞順で倧きい敎数列を出す。

ARC 184-A

コヌドはこちら

やはり600点問題は厳しく、翌日2時間38分掛けお解いた。

硬貚 $1..N$ を隣同士 $2i-1,2i$ で比范する。

  • 異皮なら䞀方が本物、䞀方が停物なので、埌で刀定するよう $i$ を $D$ に保存しおおく。
  • 同皮なら䞡方ずも本物もしくは䞡方ずも停物なので、union-find朚でマヌゞしお代衚元を $L$ に保存しおおく。このずきunion-find朚における $size(x)$ を、 $x$ が属する集合の倧きさずする。

$|D| = M$ なら、 $D$ の芁玠でない硬貚はすべお本物であり、それらず比范すれば答えが出る。

$|D| < M$ なら、 $L$ を芁玠数の昇順に䞊べお、䞡端 $L_l, L_r$ から比范する。 $l = 1,2,...$, $r = |L|,|L|-1,...$ ずしお 候補 $L_l, L_r$ を比范する。比范結果を基に、候補の代衚元を $S$ 、停物の硬貚の集合の代衚元を $U$ ずしお曎新する。

  • $l = r$ なら、その芁玠を埌で比范するこずにしお、 $S$ に $L_l$ を远加しお比范を終了する。
  • $Z = M - |D| - |U| < size(x)$ なら、 $x$ を代衚元ずする集合はすべお本物の硬貚である。よっお $size(L_1) > Z \land size(L_r) > Z$ なら、䞡方ずも本物なので、ク゚リを投げるこずなく $L_1$ ず $L_r$ をマヌゞしお $S$ に远加する。
  • そうでなければク゚リを投げる
    1. 同皮なら $L_1$ ず $L_r$ をマヌゞしお $S$ に远加する。
    2. 異皮か぀ $size(L_l) > Z$ なら、 $L_r$ を代衚元ずする集合はすべお本物の硬貚でなので、 $U$ に远加する
    3. 異皮か぀ $size(L_r) > Z$ なら、 $L_l$ を代衚元ずする集合はすべお本物の硬貚でなので、 $U$ に远加する
    4. 䞊蚘以倖なら本物か停物かはただ分からないので、 $L_l, L_r$ を $S$ に远加する。

䞀通り $L$ に぀いおみたら、 $S$ で $L$ を眮き換える。これを $L$ が䞀芁玠になるか、 $M - |D| - |U| = 0$ になるたで繰り返す。 $M$ が $N$ よりずおも少ないので、い぀かは本物の集合が倧きくなっお、停物の集合ず䞊蚘ii,iiiで比范可胜になる。

こうするず停物の硬貚は $D$ か $U$ に含たれる。 $i \in D$ に぀いお $L_1,2i$ を比范し、同皮なら $2i-1$ が停物、異皮なら $2i$ が停物である。これで $M$ 個すべおの停物を特定できる。

䞊蚘の解き方は公匏解説2-1に䌌おいる。公匏解説1の通り解くず こう なる。この発想が無いず解答時間が2時間に収たらない。

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完する。そしお203-Bで類題が出おも蚌明を思い぀かなかった。

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らしい良問であるが私の手には負えなかった。

ARC 200-A

前日のABCで氎色に戻ったのでratedで参加した。

コヌドはこちら

解説を芋るたで党く分からなかった。B問題を解いた埌マルチテストケヌスがほが党滅し、解無しの条件を芋抜けないたたコンテストが終わった。

解無しの条件は $A/B$ にあるこずも、二か所遞んで残りは0だずいうこずも思い぀かなかった。解説が分かれば。陀算ではなく積で比范する $A/B = C/D \equiv AC=BD$ ように実装するず解説ACする。

ARC 200-B

A問題よりB問題の方が簡単ず芋切っおB問題に時間を党振りしたが、予想倖に手こずった。15:06で出したずきは勝ったず思ったがそれほど甘くはなく、77:46ず7ペナの満身創痍でACした。

コヌドはこちら

芋るからに乱択アルゎリズムだず思った。公匏解説は決定的アルゎリズムだが、乱択アルゎリズムで解けるので以䞋私の解き方を述べる。倉数を以䞋の通り定矩する。

  • $A_1$ 桁の解の䞀぀を $A$ ずする
  • $A_2$ 桁の解の䞀぀を $B$ ずする
  • $L = LCM(A,B)$ ずする

明らかな状況を凊理する。

  • $max(A_1, A_2) = A_3$ なら $L$ は10のべき乗にするず題意を満たす。答えは Yes で、 $A = 10^{A_1}$, $B = 10^{A_2}$ ずする
  • $max(A_1, A_2) &gt; A_3$ はLCMの桁数が足りないので No である。なぜなら $A,B \leq LCM(A,B)$ だからである。
  • $A_1 + A_2 &lt; A_3$ はLCMの桁数が倚すぎるので No である。なぜなら $AB \geq LCM(A,B)$ だからである。

それ以倖の堎合぀たり $max(A_1, A_2) &lt; A_3$ か぀ $A_1 + A_2 \geq A_3$ のずきは、答えが Yes ず信じおランダムに探玢する。

$U$ は $p = A_1 + A_2 - A_3$ 桁のある数である。 $p = 0$ のずきは、 $U = 1$ ずする。 $p &gt; 0$ なら $p$ 桁の玠数 $U$ を芋぀ける。これはランダムな $p$ を遞んで、ミラヌラビン玠数刀定法で刀定すればよい。コンテスト䞭はこうしたが、埌で他の型の解法を読んで、実は玠数ではなく $U=10^{p+1}$ で 構わない ず分かった。ここで $U=10^{p}$ ではないのは、 $A_1$ 桁の数ず $A_2$ 桁の数の積は、 $A_1 + A_2 - 1$ 桁になりうるからである。

$A_1 - P$ 桁の $C$ , $A_2 - P$ 桁の $D$ それぞれに぀いお、これらの桁数にあう玠数を求める。乱数を䜜っお、ミラヌラビン玠数刀定法で刀定すればよい。コンテスト䞭はこうしたが、実は玠数刀定しないで以䞋に進んだ方が 速かった 。 $U,C$ を玠数にしお $D$ は玠数でなくおも、 $C,D$ は互いに玠なのだから 速い 。

このような数 $U,C,D$ が芋぀かったら、 $A = UC$, $B=UD$ ずすれば、 $L = UCD$ なので $L$ が $A_3$ 桁かどうか確認しおそうであれば出力する。違ったら乱数を遞ぶこずからやり盎す。 $L$ が $A_3$ 桁ではないこずがあるので怜算する。

案 U C D 実行速床(msec)
私のコンテストの提出 玠数のみ 玠数のみ 玠数のみ 82
私のコンテストの提出改 玠数のみ 玠数のみ 玠数に限らない 45
埌で知った他の方の案 10の(P+1)乗 玠数のみ 玠数のみ 42
さらに改良 10の(P+1)乗 玠数に限らない 玠数に限らない 19

TLEが返っおきたのは、最初は垞に $U = 1$ で探玢範囲が広すぎたからだず思う。しかし埌はおそらく $P = 0$ か $A_1 = A_2$ の凊理がたずくおTLEしたのだず思う。混乱しおいおTLEの原因が分からなかった。それず $a \leq b$ を仮定するずいう凊理は䜙蚈だった。

テストケヌスは $17^3$ 通りしかないのだから、手元で党郚詊せばよいず埌から思い぀いた。なぜ本番で党ケヌスをテストするこずを思い぀かなかったのだろう。7回のペナルティがなぜ間違ったのか分析する方がよさそうである。ちなみに最初の提出はLCMがオヌバヌフロヌする。

ARC 201-A

たたしおも0完に終わった。䞀通り問題を眺めた埌、A問題に時間を党振りしお結局解けなかった。

それどころか、コンテスト䞭には解けないず思ったC問題を、成瞟衚を埅っおいる間に解けおしたった(2025-06-23 00:12:31)。どうしお私は、解ける問題ず解けない問題の区別が぀かないのだろう。

コヌドはこちら

䜕日考えおも分からず、公匏解説を読んでも分からず、他の方の解答を読んで、私はどうやら問題を誀読しおいたず分かった。

よく問題文を読むず、Div.1にはEasyがなく、Div.2にはHardがない。これを間違えお、Div.1にwriterを問わないEasyがあり、Div.2にwriterを問わないHardがあるず勘違いしおいた。解けるわけがない。

問題文を正しく読むずこうなる。同じwriterからDiv.1たたはDiv.2に出せる問題数の䞊限は $min(B_i, A_i + C_i)$ 個である。よっお $B_i$ を $min(B_i, A_i + C_i)$ で眮き換えお構わない。このあず、 $A_i$ を $min(A_i, B_i)$ で眮き換え、 $C_i$ を $min(C_i, B_i)$ で眮き換える。

$B$ のこずはいったん忘れお、Div.1に出せる問題数の䞊限は $\sum A$ 、Div.2に出せる問題数の䞊限は $\sum C$ である。その䞊で $B$ の制玄は $\lfloor (\sum B)/2 \rfloor$ である。これらをたずめるず答えは、眮き換え埌の $min(\sum A, \sum C, \lfloor (\sum B)/2 \rfloor)$ である。

ARC 201-C

コヌドはこちら

問題文が非垞に難解だが、平たく蚀えば以䞋の通りである。

二分朚を考える。朚の根から䞀文字目が A たたは B 、二文字目が A たたは B ずいう分岐を繰り返す。 $S_i$ に察応するノヌドから先は、埌続の任意の文字列を網矅できる(接頭蟞なので)。これで葉の数が $10^{100}$ のAB文字列の党域を芆うこずができるか考える。

党域を芆うこずができなければ答えは0である。芆うこずができるなら、葉から再垰的に $S$ の郚分集合の組み合わせ数を求めるこずができる。埌続の文字が A に察応する郚分朚を巊、 B に察応する郚分朚を右ず呌ぶ。

  • 葉ノヌドに぀いお、組み合わせは1通りである
  • あるノヌド $v$ に぀いお、巊の郚分朚の組み合わせを $L$ 、巊の郚分朚の組み合わせを $R$ ずしお、答えの組み合わせに $LR$ を加える。これは $v$ がある $S_i$ に察応しないか察応しおも郚分集合に加えない堎合に、巊右䞡方から郚分集合を遞んで組み合わせるこずを意味する。
  • あるノヌドがある $S_i$ に察応するずきだけ以䞋を考える。巊の郚分朚にある $S_{1..(i-1)}$ のノヌド数を $A$ 、右の郚分朚にある $S_{1..(i-1)}$ のノヌド数を $B$ ずしお、 $2^{A+B}$ を答えの組み合わせに加える。これは芁玠数 $A+B$ の任意の郚分集合に぀いお、 $S_i$ を郚分集合に加えさえすれば、他の芁玠の有無は問わないこずを意味する。特に $A+B=0$ なら $1= 2^0$ 通りであり、葉ノヌドに぀いお組み合わせは1通りであるこずず敎合性がある。

$S_{i=1..N}$ に察しお、順に以䞋のようにたどる。

  1. 根から $S_i$ に察応する朚の枝を䜜る。枝ずノヌドがなければ远加し、あれば再利甚する。トラむ朚を構築するのず同じ方法である。
  2. $S_i$ の最埌の文字に察応するノヌド $v$ から根に向かう。郚分朚の組み合わせ数 $L,R$ ず、郚分朚にある $S_{1..(i-1)}$ のノヌド数 $A,B$ を芪ノヌドに䌝搬しながら曎新する。根が保持する郚分集合の組み合わせ数が答えなので出力する。

文字列長の和 $\sum |S|$ に制玄があるので、ノヌドから根の探玢長もそれに制玄されお(文字列長を䞀埀埩するので)、TLEせずACする。なお std::accumulate を䜿っおも別に速くは ならない ので玠盎に left, right ず曞く方が簡単である。

ARC 202-A

コヌドはこちら

boost::multi_index_container で std::set å…Œ std::list を䜜り、小さい数から持ち䞊げいけばよいのは分かった。しかし同じ数を早めに合䜵するのが最適だずいうこずを芋抜けなかった。䞡端を $\infty$ のセンチネルにするず実装しやすい。

ARC 203-A

コンテストに参加せず埌日解いた。結果は埮劙で、本番の時間制限ず緊匵の䞋で勝おるかず蚀うず䜕ずも蚀えない。

コヌドはこちら

䞉十数分ず倥しいペナルティの末ACした。盞倉わらず400点茶diffが遅い。

$M=1$ なら答えは1である。以䞋 $M &gt; 1$ ずする。

$L = \lceil M / 2 \rceil$ , $R = \lfloor M / 2 \rfloor$ , $L \geq R$, $L + R = M$ ずする。

チヌム1に党勝の人が $L$ 人、党勝で無い人が $R$ 人いるずする。チヌム $2..N$ に党勝の人が $R$ 人、党勝で無い人が $L$ 人いるずする。実はこのようにできお、答えは $L + (N - 1)R$ である。

党勝で無い人ずは、党勝の人に必ず負け、それ以倖の人ずの勝ち負けは問わない人である。よっお以䞋のように構成できる。これらは $L \geq R$ より可胜である。

  • チヌム1の党勝の $L$ 人は、チヌム $2..N$ の党勝でない $L$ 人に必ず勝぀
  • チヌム $2..N$ の党勝の $R$ 人は、チヌム $1$ の党勝でない $R$ 人に必ず勝぀
  • チヌム $2..N$ の党勝の $R$ 人は、チヌム $2..N$ の党勝でない $L$ 人に必ず勝぀

負ける偎から芋おも同じこずが蚀える。しかしこの解が䞊限であるこずを蚌明できおいない。

ARC 203-B

コヌドはこちら

䞀時間以䞊ず倥しいペナルティの末ACした。茶diffは遅いが、氎diffがたあたあの速床で解けたのはなぜだろう。

$A = B$ なら Yes 、 $\sum A \ne \sum B$ なら No 、 $N=2 \land A \ne B$ なら No である。以䞋 $N &gt; 2$ で、 $\sum A = \sum B$ ずする。

$\sum A = 1$ のずき、 $10...0$ を $0...01$ にするこずはできない、぀たり最巊の1を最右に移動するこずはできない。同様に $0...01$ を $10...0$ にするこずはできない、぀たり最右の1を最巊に移動するこずはできない。操䜜は可逆なので、 $A,B$ のどちらか䞀方がこうなら答えは No である。

それ以倖の答えは Yes である。 $\sum A = 1$ なら、連続する0を適宜移動しお $A$ を $B$ にできる。これに加えお、 $\sum A &gt; 1$ なら、 $10$ ず $01$ を亀換するこずで、 $1$ の䜍眮を任意に移動するこずができる。ここが未蚌明で、正しくは公匏解説の通りである。

最初に浮かんだのはARC 185-Bで、終端状態を定矩すればそこに至る経路を厳密に問わないこずであった。䟋えば 0 ず 1 を区分化する、぀たり0の列の埌に1の列を䜜るこずである。やはり公匏解説はそうだった。最初の盎感を倧事にし、操䜜は可逆だずいうこずに気が付いお゚ッゞケヌスを導出すれば、もっず早く解けたはずだ。

ARC 205-A

久しぶりのratedである。今回も正解者数ず自分の難易床は連動しないだろうず思い、A,B,C,D問題を䞀通りみおから、D問題に時間を党振りした。A問題が二次元环積和なのはすぐ分かったがその先が芋えず、A問題1完では氎色に残れないのは明らかなので(灰diffだった)もっず埗点の高い問題から解く必芁があった。

D問題を解いた残り時間でA問題は解けたが、B,C問題は解けなかった。盞倉わらず、正解者数ず自分の難易床は連動しない。正解者数を無芖しお自分に解ける問題をしっかり遞ばないず氎パフォが出ない。D問題は青diffで、コンテスト䞭に解けたのはこれが2床目である。䞀問目に青diffに着手するのは床胞がよすぎるが、B,Cの氎diffx2を解けない私にはこれしか勝機がなかった。B問題は党くわからず、C問題は機転が利かなかった。それず実装に時間が掛かりすぎである。

コヌドはこちら

制玄から明らかに二次元环積和である。

初期マスを $G$ ずする。あるマス $G[y][x]$ に぀いお、このマスを巊䞊ずする2x2癜領域 $M$ を求める。 $G[y][x], G[y+1][x], G[y][x+1], G[y+1][x+1]$ がすべお癜なら $M[y][x]=1$ 、そうでなければ $M[y][x]=0$ ずする。

$M$ の二次元环積和 $C$ 求めるず、2x2癜領域の数が分かる。ク゚リに $U,D,L,R$ に察しお、 $C[D-1,R-1] - C[D-1,L-1] - C[U-1,R-1] + C[U-1,L-1]$ を返す。䞋端ず右端は塗れないので、領域が1行1列小さいこずに泚意する。

二次元环積和が久しぶりすぎお実装に手間取った。もう少し手際よく曞けおもいいはずだ。

ARC 205-B

コヌドはこちら

完党グラフの蟺の数は $C = N(N-1)/2$ であり、答えは $C$ ず $C-1$ のどちらかずいう盎感はあった。ある数があっお2単䜍でしか倉わらないだろうずいうのも分かった。しかしその数が䜕かが党く分からなかった。

公匏解説に曞いおある通りである。答えは $C$ ず $C-1$ のどちらかずいう前提がそもそも間違っおいた。蟺の数ではなく頂点の次数に泚目すべきで、ここを間違えたら解ける芋蟌みはなかった。

ARC 205-C

コヌドはこちら

ARC 162-Aのような問題だず思い、䜕ずなく解法は分かったが、実装方法が分からなかった。コンテスト䞭に65分あったのだから、これは解きたかった。

たず $S,T$ を座暙圧瞮しお、0-based indexingで $0..(2N-1)$ ず振り盎す。

$S_i &lt; S_j$ か぀ $T_i &gt; S_j$ を満たす $(i,j)$ の組があれば答えは No である。これをARC 162-Aのように難しく考えすぎた。実はもっず簡単である。 $T$ の昇順に人 $i$ を䞊べ替え、 $T[j] = i$ は数盎線の巊から $j=1..N$ 番目の䜍眮に、人 $i$ が移動するこずを瀺す。

このずき、 $S$ もたた昇順になっおいるこずが求められる。昇順なら答えは Yes 、昇順で無ければ答えは No である。これは std::is_sorted(S) で簡単に分かる。たずここで぀たづいおしたった。

ある人より他の人を先に動かす䟝存関係を求めおから、トポロゞカル゜ヌトするず答えが求たる。これはコンテスト䞭に分かった。しかし䟝存関係を正確に求める方法がコンテスト䞭に分からなかった。

䟝存関係は以䞋の通り求める。人の移動元に察応するセグメント朚 $U$ ず、人の移動先に察応するセグメント朚 $V$ を䜜る。どちらのセグメント朚も区間和で、初期芁玠はすべお0ずする。

  • $j = 1$ ぀たり先頭の人 $i = T[1]$ は、さしあたり䟝存関係なしずしおおく。 $U[S_i] = 1$ , $V[T_i] = 1$ ずする。
  • 巊から $j &gt; 1$ 番目の䜍眮に動こうずしおいる人 $p = T[j]$ , その巊の人 $q = T[j-1]$ に泚目する
    • $S_j &lt; T_j$ ぀たり右に移動するずきを考える。移動䞭に他の人が居るかどうかは、 $C = T[S_j.. \infty)$ の区間和で分かる。 $C &gt; 0$ なら人 $p$ は人 $q$ より先に動く必芁があり、そのように有向グラフの蟺を匵る。
    • $S_j &gt; T_j$ ぀たり巊に移動するずきを考える。移動䞭に他の人が居るかどうかは、 $C = S[T_j.. \infty)$ の区間和で分かる。 $C &gt; 0$ なら人 $q$ は人 $p$ より先に動く必芁があり、そのように有向グラフの蟺を匵る。
    • それ以倖なら、有向グラフの蟺を匵らない

このように有向グラフを䜜り、トポロゞカル゜ヌトするず、人が動く順序が先頭から求たるので出力する。セグメント朚もトポロゞカル゜ヌトも分かり、B問題よりは時間を掛ける䟡倀があるず思ったが、考えがたずたらなかった。

ず思っお公匏解説を読んだらもっず 簡単な解き方 があった。座暙圧瞮、セグメント朚、トポロゞカル゜ヌトの重実装は、想定解ではなかった。これではコンテスト䞭に間に合わない。過去問に囚われすぎおいたのかもしれない。

ARC 205-D

コヌドはこちら

この問題から解くのは思い切りがよすぎるが、結果的にあっおいた。コンテスト䞭に青diffを解いたのはこれが2問目ずいうか、最高diffを曎新した(1853: その前はARC 188-Bのdiff1602)。このdiffは、難問ずいうより時間切れずいう感じだが。

葉のうち、高さが最も高い(根から距離が長い)頂点から2぀ず぀刈ればよい。すべおの頂点に぀いお高さず、子頂点および子頂点の数をDFSで求めおおく。

葉を (高さ、頂点番号) からなる重耇無し集合に加える。高さが倧きい葉を優先的に凊理する。葉を刈ったら葉の芪頂点に぀いお刈った子頂点を枛らす。芪頂点の子頂点が無くなったら、葉ずしお登録する。同じ芪頂点を二床刈らないように気を付ける。

重耇無し集合より優先床キュヌを䜿う方が実装しやすいし 速くなる が、 if (p0 != p1) を入れないず同じ芪頂点を二床刈っお入力䟋が合わなかった。コンテスト䞭は答えが合わず、回避策ずしお重耇無し集合に切り替えたがその分実装に時間が掛かった。

根は刈れない。2こず぀しか頂点は枛らないので根だけ残っおも刈れない。根ず他の頂点を組にしお刈るこずもできない。

問題文を䞀読しおほがこの解法が芋えた。公匏解説ず同じかどうかはただ理解しおいない。

ARC 206-A

二週ぶりのratedである。今回は玠盎に、A,B問題の順にした。A 1完 21:11では遅すぎお緑萜ちした。Rated 1完勢の䞋から10䜍ずいう倧敗で、A,B 2完なら氎コヌダヌに残れたがB問題が間に合わなかった。

コヌドはこちら

最初にそれぞれの数 $p$ の出珟回数 $C[p]$ を求める。 $i=1..N$ に぀いお順に求める。

  • 数列は少なくずも元々の1皮類ある
  • $C[A_i]$ を1枛らす
  • $i = 1$ に぀いお、 $N-1$ から $A_{2..N}$ に含たれる $a$ の数぀たり $C[A_1]$ 匕いたもの皮類だけ数列は増える。
  • $i &gt; 1$ に぀いお考える。 $b = A_{i-1}$ , $a = A_{i}$ ずする
    • $a \ne b$ なら、 $A_{i+1..N}$ に含たれる $a$ の数だけ数列の皮類が増える。
    • $a = b$ なら、数列は増えない。なぜなら $A_{i-1}$ で既に数えおいるからだ。

こうしお求めた皮類数を答える。

ARC 206-B

コヌドはこちら

コンテスト䞭は98分掛けお解くこずができず、垃団の䞭で正解を思い぀いた。

コンテスト䞭は転倒数だず思っおいたが、正解はLISである。色ごずに問題を独立に解いおよい。

ある色 $C$ に属するスラむムが $S$ 匹いお、 $P$ に関するLISが $L \leq 1$ ずする。このずきLISではない $S - L \leq 0$ 匹の色を倉えればよい。぀たり $C(S-L)$ の、すべおの $C$ に぀いおの和が答えである。LISは座暙圧瞮しおセグメント朚に茉せれば求たる。

ARC 206-C

コヌドはこちら

コンテスト䞭は題意を理解できずに諊め、埌日自力ACした。挞化匏は分かったが実装がなかなか合わず、実装に2時間掛かった。実装の正確さが足りないなら、ARCでは勝負にならない。

$N=1$ のずきの答えは1, $N=2$ のずきの答え総圓たりで求める。以䞋 $N &gt; 2$ ずする。

$(i, B_{i})$ , $(i+1, B_{i+1})$ の組み合わせを考える。

  • $(i, B_{i}) = (i, i+1)$ のずき、 $(i,i+1)$ を連結にできる。よっお $(i+1, B_{i+1})$ は䜕でもよい。
  • $(i+1, B_{i+1}) = (i+1, i)$ のずき、 $(i,i+1)$ を連結にできる。よっお $(i, B_{i})$ は䜕でもよい。

これを基に挞化匏を考える。これがややこしくお実装に手間取った。 $DP[i][0..2]$ を、 $B_i = i+1, B_i = i-1, B_i \ne i+1, i-1$ のずきに取り埗る組み合わせ数ずする。

$i = 1$ のずきを考える。

  • $B_i = -1$ なら $DP[1] = (1,0,N-1)$ である。これがややこしい。
  • $B_i = 2$ なら $DP[1] = (1,0,0)$
  • $B_i \ne -1, 2$ なら $DP[1] = (0,0,1)$

$i &lt; N$ のずきの挞化匏を立おる。明瀺的に蚭定しない倀は0である。

  • $B_i = -1$
    • $DP[i+1][0] = DP[i][0]$
    • $DP[i+1][1] = DP[i][0] + DP[i][1] + DP[i][2]$
    • $DP[i+1][2] = DP[i][0] \times (N-2)$
  • $B_i = i+1$
    • $DP[i+1][0] = DP[i][0]$
  • $B_i = i-1$
    • $DP[i+1][1] = DP[i][0] + DP[i][1] + DP[i][2]$
  • それ以倖
    • $DP[i+1][2] = DP[i][0]$

$i = N$ のずきの挞化匏を立おお答えにする

  • $B_i = -1$ なら答えは $DP[N-1][0] \times N + DP[N-1][1] + DP[N-1][2]$
  • $B_i = i-1$ なら答えは $DP[N-1][0] + DP[N-1][1] + DP[N-1][2]$
  • それ以倖なら答えは $DP[N-1][0]$

想定解法は党く異なる。

ARC 208-A

0完で倧敗し、ratingが1159たで萜ちた。䞀幎間ABCではなくARCにratedで出るのは楜しかったが、ARC ratedはこれが最埌かもしれない。

それどころか、120分あれば解けるA問題を捚おお、B問題に党振りしおしたった。B問題をWAした埌にA問題を10分考えお分からないのでB問題に戻ったが、翌朝にA問題を解けおしたった。盞倉わらず、解ける問題ず解けない問題の区別が぀かない。

コヌドはこちら

基本的なnim問題の解法は、すべおの山の石の数に぀いお、xorが0なら埌手必勝、そうでなければ先手必勝である。厳密な蚌明は教科曞を読むずしお、盎感的な理解は山を同じ高さからなる二぀の成分に分解し、埌手が垞に察消滅させるこずができれば埌手必勝である。

以䞊の芖点からこの問題を捉える。ゲヌムの芏則から $2^i$ 成分を消すこずはできないので、最埌に $2^i$ 成分が党お残れば埌手必勝である。よっお $XOR(A) = OR(A)$ なら埌手必勝(Bobの勝ち)、そうでなければ先手必勝(Aliceの勝ち)である。公匏解説には詳しい議論が茉っおいる。

A問題なのだから実装は簡単ずいうメタ読みはあったが、コンテスト䞭は立っおいるビット数をXORするずか芋圓違いの方針しか立たなかった。

それずA問題1完では緑パフォだろうず思い、D,C,B問題の順にみお、意図的にA問題を無芖した。実際氎パフォのボヌダヌはB問題1完 73分なので、A問題1完は最速でも緑萜ちである。A問題を解けばレヌティングの䞋がりも少なかったのでは、ずいう発想は無かった。

ARC 208-B

コヌドはこちら

公匏解説2の方針で臚んだが、結局解けなかった。

$M &gt; 1$ を固定しお $A mod M$ を最倧にするような $A$ は、 $2M-1$ である。

よっお $N$ が十分倧きければ、 $2,3,5,9... = 2^{i=0..} + 1$ にすればよい。 $\sum_{i=1}^{N-2} (A_{i+1} mod A_{i}) = 2^{N-2} - 1$ , $\sum_{i=1}^{N-1} (A_{i+1} mod A_{i}) = 2^{N-1} - 1$ である。よっお $A_{i}$ に $A_{i+1}$ を䜜るのに䜕を足すかず蚀えば、 $A_{j+1} - A_j$ の环積和が $K$ 以䞋なら足せるだけ足し、そうでなければ0を足す。

$N$ が小さいずきは党䜓を $2^C$ 倍しおおくこずで、同様に答えが求たる。 $C$ は $K$ の2進数の桁数(bit width)から $N-1$ を匕いたものである。はずなのだが、コンテスト埌もどうしおも 6 WAsが取れなかった。この方針は公匏解説2ず同じに芋えるが、実は係数は $2^C$ ではなく $2 + ((K-1) / (2^{N-1}) - 1))$ である。コンテスト䞭は2の階乗に限らないず気が付いたが(係数は間違っおいるが)、翌日解いたずきはなぜか分からなかった。それず初項以倖を定数倍したら答えが合わない(前項から1足すのが最適なので)。

公匏解説の if n < 50 を倖しお、 $max(2, 2 + ((K-1) / (2^{N-1}) - 1))$ にするず 6 WAs が出る。私が解けなった理由はここにありそうだ。

コンテスト䞭は、 $N$ が十分倧きい堎合はすぐ分かったが、 $N$ が小さいずきの調敎が分からなかった。 $C$ を䜕にしようか迷っおREが倚発し、混乱しおいおたずもな解が出る芋蟌みがなかった。翌日半日かけお解けなかったのだから、そもそも着手しおはいけない問題だったかもしれないずいうか、これが解けないならARCで勝おる気がしない。

公匏解説の1の通り、二分探玢で 解ける 。 $A_1$ を二分探玢しおも解けなかったが、 $A_N$ を二分探玢したら解けた、ずいうか $A_N$ を求める問題なのだから玠盎にそうすべきだった。

ARC 208-C

コヌドはこちら

コンテスト䞭はちらっず芋ただけで通り過ぎ、埌日解いた。色々䟋を詊したら法則性が芋えたので提出したら自力ACできおしたった。䞀応120分は切ったが、解ける問題をうっかり捚おおしたったずいうより、未蚌明の実隓がうっかり通るずはコンテスト䞭には想像しなかった。

解の候補が実際に解を満たすか確認する関数 $f(C,X,N)$ を甚意する。解の候補を挙げおどれかがが解の条件を満たせばそれを出力し、なければ -1 を出力する。

$C$ のビット数(二進数での桁数)を $|C|$ 、 $X$ のビット数(二進数での桁数)を $|X|$ ずする。解の候補は、 $2C$ , $C \oplus X$ , $2^{|C|} + \lfloor (C - X) / 2 \rfloor$ である。

$C = X$ か぀ $C$ が2のべき乗なら、 $N = 2C$ ずするこずで、 $(2C \oplus C) mod 2C = 3C mod 2C = C = X$ を達成できる。

$N = C \oplus X$ ずしたずき、 $X &lt; N$ なら $(C \oplus X \oplus C) mod N = X mod N = X$ を達成できる。 $|C| &gt; |X|$ なら $N = C \oplus X &gt; X$ より必ず達成できる。

$C$ の党ビットが1か぀、 $C - X$ が非負の偶数ずする。 $D = (C - X) / 2$ ずする。 $C = 2^{|C|} - 1$ , $N = 2^{|C|} + D$ である。 $(2^{|C|} + D \oplus 2^{|C|} - 1) mod N = (2^{|C|} + 2^{|C|} - 1 - D) mod (2^{|C|} + D)$ であり、 $(2^{|C|} + D + 2^{|C|} - 1 - 2D) mod (2^{|C|} + D)$ であるから、 $(C - 2D) mod N = X mod N = X$ を導ける。なお $C = X$ の堎合はここに含たれるらしい。

$C$ のあるビットが1ではないずきの蚌明が分からず力尜きた。蚌明は公匏解説に茉っおいる。十分倧きな $N$ を䜿えばよいずいう盎感はあったが䜿い道が分からなかった。

これ以倖に解はないず祈ったらACした。Rで色々ず詊し、 $C$ の党ビットが1の時が解ありであるこずを発芋しお通した。

f <- function(c,x,n) { bitwXor(n,c) %% n }
which(f(c=31, x=19, n=1:110) == 19)
# [1]  38  70 102
which(f(c=31, x=21, n=1:110) == 21)
# [1]  37  69 101
which(f(c=31, x=23, n=1:110) == 23)
# [1]  36  68 100

ARC 210-A

氎コヌダヌに戻るのは間に合わなかった。

コヌドはこちら

いくら考えおも分からず、解説を芋おも正圓性が分からない。公匏解説をほが䞞写ししたのが䞊蚘である。

ARC 210-B

コヌドはこちら

A問題は解けないが、B問題は時間無制限で解けた。方針はすぐ立ったが、実装方法が分からなかった。

最初にク゚リを先読みしお、 $A,B,x$ で重耇する数倀には連番を振っお䞀意にする。 $A_{1..N}, B_{1..M}, x_{1..Q}$ に察しお $1..(N+M+Q)$ を割り圓おお、数倀を以䞋の Node のように再解釈する。

struct Node {
    Num value {0};
    Num serial {0};
    bool operator<(const Node& other) const {
        return ((value < other.value) ||
                ((value == other.value) && (serial < other.serial)));
    }
};

次にセグメント朚を6本甚意する。 $U = A \cup B$ ずしお、 $A,B,U$ に぀いお、倀 Node の集合 $S$ ず、出珟回数 $cnt \in { 0, 1 }$ の集合を管理する。

  • $SA$ は、 $A$ の倀を乗せたセグメント朚で、区間和を取る。 $value$ の和を取る。 $serial$ の和は無意味だが $serial$ の最倧倀ずしおおく。
  • $CA$ は、 $A$ の出珟回数を乗せたセグメント朚で、区間和を取る
  • $SB$ は、 $B$ の倀を乗せたセグメント朚、 $CB$ は、 $B$ の出珟回数を乗せたセグメント朚ずする。
  • $SU$ は、 $A \cup B$ の倀を乗せたセグメント朚、 $CU$ は、 $A \cup B$ の出珟回数を乗せたセグメント朚ずする。
  • 倀からセグメント朚䞊の添え字を求めるテヌブル $T[node]$ を䜜る。

最初に $A$ の䞭倮倀を調べる。 $A$ を昇順に芋お $N/2$ 番目の倀を $p$, $1+N/2$ 番目の倀を $q$ ずする。 $p$ 未満の倀の集合を $LA$ 、 $q$ より倧きな倀の集合を $RA$ ずするず、 $A = [LA,p,q,RA]$ ず衚珟できる。

$p$ の倀は $CA$ の先頭からの环積和が $N/2$ 以䞊ずなる最小の倀 $lv$ である。これは $CA.maxRight(cumsum &lt; N/2)$ で求たる。倀をセグメント䞊の添え字にするには $T[lv]$ で倉換する。

同様に $q$ の倀は $CA$ の末尟からの环積和が $N/2$ 以䞊ずなる最小の倀 $rv$ である。これは $CA.maxLeft(cumsum \leq N/2)$ で求たる。倀をセグメント䞊の添え字にするには $T[rv]$ で倉換する。これで $A$ 䞭倮倀前埌の倀ず、セグメント朚䞊の䜍眮が求たった。

問題文の操䜜の意味を考える。 $B_i$ のそれぞれの倀に぀いお、 $A$ の操䜜埌の倀は以䞋のようになる。

  • $B_i \leq p$ なら、 $U$ の $p$ 以䞋の倀のうち最倧の倀が䞭倮倀なので陀く
  • $B_i \geq q$ なら、 $U$ の $q$ 以䞋の倀のうち最小の倀が䞭倮倀なので陀く
  • それ以倖なら $B_i$ 自身が䞭倮倀なので、 $A$ は倉わらない

操䜜埌の倀を考える。 $U$ の $p$ 以䞋の倀が $C_{Ul}$ 個、 $B$ の $q$ 以䞋の倀が $C_{Bl}$ 個あるなら、 $U$ の小さい方から $D_l = C_{Ul} - C_{Bl}$ の個の倀が残る。 $C_{Ul}$ は $CU.prod(0, T[lv]+1)$ で求たる。 $C_{Bl}$ は $CB.prod(0, T[lv] + 1)$ で求たる。 $U$ の小さい方から $D_l$ 番目の倀のセグメント朚䞊の䜍眮は $ru = CU.maxRight(cumsum &lt; D_l)$ で求たり、倀の和は $SU.prod(0, ru+1)$ で求たる。

同様に、 $U$ の $q$ 以䞊の倀に぀いおも、和が求たる。

最埌にク゚リの曎新方法に぀いお述べる。ク゚リ $(1,i,next)$ ずする。ここで $next$ は入力倀 $x_j$ に連番を振ったものである。

  • ク゚リ前の $A_i$ を $prev$ ずする
  • ク゚リ前の $prev$ の、セグメント朚䞊の䜍眮は $T[prev]$ である。
  • ク゚リ埌の $A_i$ の、セグメント朚䞊の䜍眮は $T[next]$ である。
  • $SA[T[prev]] = (0,0)$ にする
  • $CA[T[prev]] = 0$ にする
  • $SA[T[next]] = next$ にする
  • $CA[T[next]] = 1$ にする
  • $UA[T[prev]] = (0,0)$ にする
  • $UA[T[prev]] = 0$ にする
  • $UA[T[next]] = next$ にする
  • $UA[T[next]] = 1$ にする

ク゚リ $(2,i,next)$ に぀いおも、 $SB,CB,SU,SU$ を同様に凊理する。

公匏解説を読むず分かるが、そもそも䞭倮倀を求める必芁はなかった。

ARC 211-A

前日のmax-flowを萜ずしお、氎コヌダヌに戻るのは間に合わなかった。

コヌドはこちら

おそらく40分匱ず1ペナで解けた。

5以倖の足しお10になる数の組を考える。䟋えば 19 があるなら、 1..19..9 ずすれば、足しお10になる堎所は1か所のみである。

$C[i=1..4]$ を、 $min(A_i,10-A_i)$ ずする。これは $(i,10-i)$ の組を䜕個䜜れるか意味する。

$A_5 = 0$ の時を考える。

  • $C[i] &gt; 0$ ずなる $i$ が0皮類なら、足しお10になる堎所がないので答えは0である。
  • $C[i] &gt; 0$ ずなる $i$ が1皮類なら、䟋えば 1..19..9 ずするこずで答えは1である。
  • $C[i] &gt; 0$ ずなる $i$ が2皮類以䞊なら、足しお10になる堎所を互い違いにしお、 1..12..212989..98..8 ずするこずで答えは0である。

$A_5 &gt; 0$ の時を考える。5以倖の個数を $A_r = (\sum A) - A_5$ ずする。

  • $A_r = 0$ ぀たり5しかなければ、答えは $A_5 - 1$ である
  • $A_r &gt; 0$ なら5以倖の前埌に5を挟めばよく、答えは $max(0, A_5 - A_r - 1)$ である。前埌ではなく間にしお1ペナした。

ARC 211-B

コヌドはこちら

答えの䞊限が1だずすぐ分かったが、答えが $max(S) = 0$ の堎合を挙げ損ねおおびただしいペナルティが出た。

厄介なのは $max(S) = 0$ の堎合である。これがなかなか分からなかった。数字列のメンバはすべお0なので、長さだけ瀺す。

  • $X=Y=Z$ なら、 $|S_1| = |S_2| = |S_3| = X$
  • そうでなくお $X=Y$ なら、 $|S_1| = X, |S_2| = |S_3| = Z$

以䞋が $max(S) = 1$ の解である。最初に $X=1$ だけ特別扱いする。

  • $S_1$ は、先頭が0で、その埌に $Y$ 個の1
  • $S_2$ は、 $Z$ 個の1
  • $S_3$ は、 $Z$ 個の1の埌に、 $Y$ 個の0

問題文を芋お、UTF-8笊号化だず思った。぀たり1sの埌に0を眮けば、他の連続郚分列ずは重ならない。これを利甚しお、その他の堎合を構成する。

  • $Z - 1$ 個の1の埌に0
  • $Y - 1$ 個の0の埌に1。ただし先頭の0は、䞊蚘の末尟ず重なる。
  • $(X - 1)/2$ 個の 10。ただし先頭の1は、䞊蚘の末尟ず重なる。

ARC 211-C

コヌドはこちら

B問題よりずっず早く解けた。

䞀回操䜜するず、連続する朚の区間を次の操䜜で遞べるようになる。なので ..###... ずある堎合、連続する朚を挟む、朚の生えおない区間から区画を䞀぀ず぀遞ぶのが最適である。 .#.#. の䞡端(1,5)を遞ぶように連続する朚を2区間以䞊操䜜するず、わざわざ操䜜回数を枛らすので報酬を最倧化し損ねる。

朚が連続しお生えおいる、たたは連続しお生えおいない区間をランレングス圧瞮しお $S[i]$ ずする。ここで $S[i]$ は $i$ 番目の連続区間に含たれる、報酬 $R$ の重耇あり集合である。

先頭区間に朚が生えおいおもその朚は刈れないので無かったこずにしおよい。そうするず先頭を1ずしお、先頭から奇数番目は朚が連続しお生えおいない区間、偶数番目は朚が連続しお生えおいる区間である。

連続区間 $S[2i-1],S[2i],S[2i+1]$ に぀いお操䜜するず、操䜜埌はたずめお䞀぀の朚が生えおない区間になる。その区間から次の操䜜で䞀぀遞ぶずすれば $M_i = max(S[2i-1],S[2i],S[2i+1])$ ずなる区間である。よっおこのような $M_i$ が最倧ずなる区間を最初の操䜜で遞ぶべきである。 $M_i$ が䞀䜍タむの耇数の区間 $i$ があるならすべお遞ぶ。

ある連続区間 $i$ を最初に操䜜するず遞んだ時、区間の遞び方は、 $S[2i-1]$ の最倧倀を取る数の個数(1個以䞊)ず $S[2i+1]$ の最倧倀を取る数の個数(1個以䞊)の積である。これを最初に操䜜するず決めたすべおの $i$ に぀いお足すず答えである。

公匏解説は $O(N)$ 、私の解法は区間の最倧倀タむを連想配列で求めるので $O(Nlog(N))$ である。

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