ABC128

実装重いのつらい。

A - Apple Pie

よく読めば簡単。砕いて煮込めばいい。

B - Guidebook

ソートできる構造体を書いてソート。番号も持たせる。

C - Switches

Cで全探索かあ。書いた。pの制約が書いてなかったので、「まさかintに収まらないことはないだろう」と思いながら。今はpの制約も追加されてる。

D - equeue

Nが小さいので左右それぞれどこまで取るか全探索。戻す操作は最後にやればいい。dequeueっぽくない解法なのが気になるが提出。WA。しかし、どう見ても正しい。WAを1回提出しただけで終わった。

E - Roadwork

時刻0に座標-D_iを出発したことにする。これによって、座標と時間の範囲で表される通行止めを、座標の範囲で表すことができる。Xが小さい順に見ていけば、通行止めの範囲にあるDたちのうちまだ答えがセットされていないものに答えをセットしていくだけ。範囲はlower_boundでわかるが、毎回範囲を全部見るとO(N^2)になってしまう。最初は、残りをリストで管理すればいいかと思っていたが取り除かれた場所からは次の要素がわからなくて困った。なんか記憶にあって、この前のyukicoderの自分の提出を見に行ったりもしたが、結局std::setを使った。イテレータの使い方をcpprefjpで確認して書く。デバッグにかなり苦労した。また、早解きが要求されない場所で会おうな。

ABC127

調子はよかったはずだが、Eが全くわからず爆死。

A - Ferris Wheel

分岐が面倒だが、6と13を使ってきれいに書く。

B - Algae

難しそうに見えるが書くだけ。

C - Prison

範囲を狭めていく。ゲートとカードがややこしい(取り違える)(問題文はややこしくないが自分が想像しにくい状況)。

D - Integer Cards

クソムズ。気づけば簡単。書き換えるぶんを大きい順にN枚持ってきて元のに付け足してソートして大きい順にN個。

E - Cell Distance

無。解説を読んでも全くわからない。

ABC126

Fのジャッジを待っているときに測ったら36.8だった。Fのジャッジは20分近くかかったと思う。順位表を見ていると僕より後に提出した人の結果が先に出ていた。これでもしACじゃなかったらかなりの不利を被ったことになる。つまり、かなりの不利を被った人が一定数いると思われる。

今回のBみたいのはさすがにやりたくないけど、300から600までのやりたかった難易度。ABが面倒でCDEが簡単だったので、楽しむというよりは早解きのプレッシャーが大きかった。でもたくさんの問題を解くのはやはり楽しい。今回実装がかなり軽かったね。軽いとはいえグラフ、みたいなコーディングをなかなか瞬殺できなかった。

A - Changing a Character

珍しく問題文が数秒で表示された(URLを開いておいて開始と同時にF5)。Nが50。ABCのAでループだと!?まあ普通に書く。小文字への変換は'a'-'A'を足す('A'がこれで小文字になるので他でも行ける)。あ、結果的にはループ必要なかったね。

B - YYMM or MMYY

Aを提出してBを開くも、表示されるまでに30秒以上かかった。自分にとってunratedの旧ABCと違い、Aの早解きよりBの問題文を確実に得ることが重要かもしれない。さて、これはかなり苦手。答えが4通りもある。0012みたいなサンプルがないのB問題にしては不親切だなと思った。判定を関数にするかで悩むが、スマートな実装が思い浮かばないのでベタ書き。入力を整数にすることも考えたが、0で始まる入力でどうなるかわからなかったのでやめた。サンプル2の0112が僕の誕生日に見えてしまうことで、年月ではなく月日という認識も生まれてそこそこ混乱した。かなり時間は食ったが、きれいに書けたのでよかった(改めて見るとループ使えたなー)。俺の早解きはここからだ。

C - Dice and Coin

けっこう怖い見た目。問題文も全然頭に入ってこない。まあサンプルもあわせてゆっくり読めばわかる。というかサンプルの説明がかなり親切で、書ききったあとも「やるだけで説明の通りだけどいいんすか」という感じだった。whileで2倍していくとこだけだね。O(N)も考えかけたけど何の工夫も要らない。

D - Even Relation

ただの二部グラフじゃん(そして木は自明に二部グラフ)と思ったけど、「wって何?」と問題文を読んでやっと趣旨がわかった。根付き木。いや、次数が1の頂点を根にすべきかな。いやどうせ分岐するから。などと考えるうち、頂点をめちゃくちゃ増やせば辺の長さが全部1のケースに帰着できることに気づいた(解けた)。つまり、適当に決めた根からdfsして距離の和、うーん10^9だから和はintじゃ収まらないないや偶奇だけでいいじゃん。ちょっとドキドキしながら全部偶奇だけの情報にして書いていく。サンプル2がお茶目だった。

E - 1 or 2

まあA[X[i]]+A[Y[i]]+A[Z[i]]って誤読するよね。それはすぐ気づいて、Z[i]は偶奇を表すだけなのに100までって何よと思ったが、のちにZの情報は不要と気づいて納得する。情報は2数の偶奇が一致するか。じゃあ情報の数だけコストが減る?いや、矛盾がないと書かれている通り、冗長なものもありえる(紙の上で多重辺がないようにループを作ってみた)。矛盾がないのだから、ここは一つの塊として、んー連結成分を数えればよさそう。UnionFindでいける。あー、単にroot(i)==iかで確認できたか。そして、答えは単に連結成分の数(!)。コスト0がありえないとなかなか気づかなかったの弱い。

F - XOR Matching

全然わからんのでM=2のケースを手で試す。全探索プログラム書いて実験することも考えたがさすがに今回の場合は不毛そう(計算量でかいしそれで自明解以外ないとか普通にありえる)。少し考えると2^M以上の数は作れない。また、a[i]^a[j]=0なので両端はないとしていい。たとえばM=2,K=3として、3で何かをはさむのだが、3123のようにしたら131232のように他も3にできる。0は簡単に足せる。13120302とか。構成できてしまった。そもそもサンプル3つのうち2つが-1なのがあからさまで、自明解しかないか見た目で簡単にバレてしまう答えかどちらかだ。

Kが0以上2^M未満ならKを他の数で(M=3,K=3)765421030124567のようにはさんでやれば、K以外の数についてはOK。0以上2^M未満の整数たちのxorは0なので、Kについても7654210301245673こう置けばOK!と思ったらサンプルが通らない。なんかこんなこと前もあった気がする。終了後落ち着いて考えると、2^M個中各bitの立っている個数は全体の半分で2^(M-1)個、基本は偶数になる。ただしM=0のときは0が1個で1が0個(0は奇数個だが0なので)、M=1のときは0が1個で1が1個(両方とも奇数個!)。これ、なかなか慣れないなあ。

全完できてよかった。Cまでだと苦手セットでDEも差がつかないので、Fがxorでラッキーというか。思ったより難易度が低かった。rated対象の人はそう簡単に全完できないかと思ってた。5/13に高い熱が出て「新生ABCの初回に参加……!」とまあなんかあったけど結果として普通に参加できて本当によかった。ただ、ジャッジが遅いだけでなくけっこう不公平な状況だったのでratedにはならなさそう。なんというか、そういう状況になったこと自体は非常に残念だけど、そのコンテストにやはり参加して体験したいのよね。

diverta 2019 Programming Contest

Eを解き始めたころに測ったら36.8だった。開始が15分遅れたのでドキドキしながら待つのは体力的に不利だなあとか思ってた。心拍数は上がってくれたが、ちょっと空回り気味だったか。正直昼間は頭悪かったけど、まあコンテストが始まれば大丈夫やろみたいな感じでいた。実際どうだったんだろ。残念ながらEが解けなかったので、早解き回だった。解けてる問題の細かいところを詰めるの苦手だし、一つ上の見通しを得るほどの実力はないしで、このセットを早解きできないのは仕方ない。Eは解けなかったけど、解ける可能性が十分にあると思って取り組めていたので、それはよかった(難しい問題がたまには解けているという経験に支えられている感覚)(まあ自分に解けるような難易度じゃなかったかもだけど)。unratedはどんなときでも残念だけど、微妙な気持ち。人が多いとは思っていたが。人数的には最近のABCほどではないのか?まあ上位陣が多かった(解く問題数が多い)と思うしテストケースも多そうだった。

A - Consecutive Integers

まさかnCkか?と一瞬思うが連続してるのであれだ。適当に書いて、サンプルが合ってればそれで正しいやつなはずだ。すぐ提出してなんとか1分切り。ratedコンテスト内の100点問題をどうするかが悩ましいと思っていたが、普通にいつものABCのときみたいに提出してしまった。

B - RGB Boxes

これねー、RGBとrgbの意味するものがわかりづらい。数だけが重要で、ちょうどN個にしたいのね。3000は2乗が通る。変数が3個だから、まあ行けそう。rとgを決めると、そういう組が存在すればbは一意に定まる。思ったよりきれいに書けた。

C - AB Substrings

ここからは、瞬殺できなかったら次の問題を少し見るという方針。結果的には、順番に解いていくことになった。

それぞれの文字列は短い。全体でも10^5文字以内。これはデータ構造に悩む。これは問題を解いてから入力部を書いたほうがいいだろう。組み合わせは無限大って感じだが、新たに生まれる"AB"は末尾の'A'と先頭の'B'がつながったものだけだ。また、元からある"AB"は独立にカウントできる。文字列の長さは2以上なので変なケースもなさそう(別に長さ1でも大丈夫だろって少し悩んだ)。さて、全部がBAならN-1個追加される。それが最大だが。一瞬フローが浮かぶくらい、あちらを立てればこちらがという感覚だった。これ全く見通しがなくてウンウン言ってたが、場合分けすれば普通に行けそうなのでもうそれするしかなくなった。こういうのが苦手なのは自覚している。1か所足し忘れでWAを出してしまった。そして、次の提出まで8分もかかっている。細かく場合分けしてるから、サンプルで通らないパスがどこかを確認するのも時間がたっぷりかかる。

んー、BAの塊の端に蓋をするということか。コンテスト中に見抜くのなあ。AもBも余ってしまうケースというのは、BAしかないときだけ?

D - DivRem Number

面白そうだけど全然わからん。とりあえずN=100のケースでN/mとN%mを100個出力してみる。あー、これか。できそう。O(sqrt(N))を2回やる。mがsqrt(N)以下のときは普通に試すだけでいい。次に、商がsqrt(N)未満のときを全部試す。ここがややこしかった。N/m=N%m=aとして、N=a*m+aとなっているから、条件を満たして商がaになることがあるならm=(N-a)/aである。このmをチェックすればいい。具体的な式の導出は苦手だが、必要条件とかの考え方は得意。企業コンの500は難しいと思って身構えてたらわりと行けたな?

E - XOR Partitioning

コンテスト時間の半分以上を使ったのかあ。まず思いついたのは累積xor。何が求まるのかややこしいが、ソートして同じ数をカウントすると美しさが0になる区間の数がわかる。とりあえずそれを実装。そもそも区間はO(N^2)通りしかない。美しさを固定すると、ある解の奇数個の区間を合体させても解になる。aが2未満のときを考えると、含まれる1の個数が偶数の分け方と奇数の分け方がある。これはなんかDPで解けそう。すると、2^20 + NくらいのサイズでDPできるんじゃ?しかしなかなか。計算量が落ちないし、そもそもaが小さいときのDPもわかってなかった。xorで結果を出したいね。