JOI 春季トレーニング 2024

JOI 春季トレーニング 2023/2024 に参加しました。

出題された問題のネタバレを含みます。注意してください。

 

〜3 月中旬

JOI の過去問をちまちま埋めていた。思ったよりも時間が取れなくてかなり中途半端になった。もっと計画的にやるべきだと思う。

本番 3 日前になって諸々のライブラリの確認もした。今年は意識的に幅広くやった。

https://judge.yosupo.jp/problem/dynamic_sequence_range_affine_range_sum がすぐ書けるくらいにはなった。

 

立ち回り(共通)

次の方針で競技に取り組んだ。

  • 最初に各問題 30 分ずつ考える時間を取る、このときコーディングはしない
  • デバッグ用の環境を整える時間を惜しまない、具体的には DBG(a, b, c, d); のように書いたら int でも pair でも vector でもすぐ出力できて、コンパイルオプションですぐ消せるマクロを書く

1 つめは一長一短だと思う。2 つめはデバッグが楽になる効用が大きいので手間を惜しまずやるべきだと感じた。

 

1 日目

fish3 を考える。R が固定なら素直な貪欲でよくて、一般の場合も分割統治で適当にやれば全て処理できる。実際は分割統治なんていらなくて無駄に面倒な方針だったが、程なくして通った。

ski2 を考える。H を決めるとコストが見通しの良い形で書ける。H の上限が小さいとき、素直に DP にすると 4 乗で、遷移の形を工夫すればすぐ 3 乗になる。これで 86 点。H の上限が大きい場合を考えて、とりあえず 4 乗を投げると通ってしまった。(実際には 3 乗になっていそうな雰囲気はするが真面目な計算量解析ができなかった。)

spy3 でとりあえず自明部分点を取る。最短路木をとったあとそれなりに頑張れば 1800bit くらいにはなったが、実装が終わらず 8 点のまま。

合計 208 点で、2 位だった。

 

2 日目

tricolor が難易度 12 だと主張してくるので身構える。隣接 2 つの組で 0,1,2 が表現できるが、復元の際に 2 択が生じて困る。適当な 012 の列を乱択で作って二人で共有し、これを送ることにすると、確率は解析できないが少なくとも手元では良い感じの挙動を示す。送ると 40 点が返ってくるので、ここで切り上げて他の問題に行く。

boardgame は他 K-1 人のコストが大体プレイヤー 1 の停止回数に関する上凸な関数になるのは良くて、ここで少し止まった。よく考えると K 個の線分を全て直線として扱っても良いので、 O(KM\log(N)) になる。一旦ここで実装しようとするが、大量にバグを埋める。結局特殊な制約でたまたま通る部分点しかもらえなかった。

さすがにまずいので vegetable5 をやる。とはいっても部分点 67 点分はそこまで難しくなかったので考察はもう終わっていて、あとは実装するだけだった。こっちもかなりバグらせたが、一応通って事なきを得た。

2 日目の点数は 124 点で、ここで 1 位になった。どうやた vegetable5 の満点の時間制限が厳しいらしく、こっちに行っていた人が大変なことになったらしい。

 

3 日目

3 問とも一読した感じでは可能枠に見えてしまうので悩む。とりあえず collection を考える。すぐに 3 乗にはなって、そこからが進まない。紙の上でしばらく考察するが、ちょっと考察を進めるたびにすぐに嘘が紛れるので全然進まない。結局最初の小課題より後の点は取れなかった。

joitour を考える。いろいろな情報を載せて大きなモノイドを作って、気合いで更新を速くする問題にしか見えない。HLD と segtree もどきで頑張ればできそうではあるが突っ込むのはまずいと思い一旦次へ。

tower で大変なことになる。最初に区間を set で管理する例のテクの方針が見えてしまう。これがとんでもない外れ方針。制約が小さくても実装が簡単になるタイプではないので、最初から満点を見据えて実装するが、やることが多すぎて心が折れる。(一応解けるとは思っているが結局実装できなかったのでわからない。)ここに時間を大量に吸われたのがよくなかった。

最後 1.5 時間くらいは joitour につぎ込むことにした。書ける小課題を全て書きながら、モノイドの構造を考えた。ただ結局満点の実装は終わらなかった。

3 日目の点数は 68 点で、ここで 2 位に落ち下との点差も詰まった。tower を多くの人が通していて辛かった。JOI 春季トレーニングに参加するのはこれが 3 回目だが、3 日目で良い成績を取れた覚えがない。

 

4 日目

問題を読むと、escape2 はまあなんとかなりそうだが island と tabletennis が ad-hoc なパズルにしか見えず嫌な感じになる。特に island は 2 年前の Super Dango Maker と同じ匂いがして、周りが大量に通すのに自分は満点を取れないタイプの問題に見えた。

ひとまず escape2 からやる。ダブリングで自然に小課題 4 までは解ける。満点は M の値を sqrt で分けてやれば良さそうに見える。実装すると満点の一個手前の若干制約が小さいケースまでが通った。ここで満点に粘着しても 10 点しか増えないことを思い出し、きっぱりと escape2 から離れた。

island を考える。最初は直径を取ることを考えていたが、しばらくしてあまり見通しがよくないように感じ始める。タイブレークが頂点番号の大小で決まることを使うことを考え出した。頂点 1 に隣接する頂点の列挙は確かに簡単にできて、うまく使えば 4N 回の質問で木を特定できることに気づく。ただ 4N には部分点がついておらず、先に進むには 3N 回に改善する必要がある。しばらく考えたがわからなかったので、大量の枝刈りを入れて改善する方向に進んだ。手元でランダムケースを作って試すと多くても 2.9N 回くらいで特定できていそうだったので投げると、1 ケースだけ通らない。あれこれ頑張ってみたが結局通らなかった。厳しい。

tabletennis は少し考えたが全く解ける見た目をしていなかったので 9 点だけ取ってすぐに撤退した。完全に結果論だが island の時間をもう少しこっちに割くべきだったかもしれない。後で聞くと上界をエスパーして山登りをするとそれなりに点が入るらしい。そんな...

昼休みのときにどこかからうっすらと island が満点みたいな話が聞こえてきたので、上位 4 人に入れていないことを確信して落ち込んでいた。蓋を開けてみるとギリギリ 4 位で、5 位との点差は 9 点だった。本当に危なかった。

IOI までにもっと時間の使い方を考えます

PCK'22 参加記

チーム決め

気づいたら PCK 予選の申し込み締切が迫っていた。焦ってパ研の Discord で相方を募集したら anmichi さんが手を挙げてくれたので、組んだ。

チーム名は特にひねらずに二人のハンドルネームをそのまま繋げた。

予選

ノーペナで全完できた。チームでは 164 点 3 ペナで 2 位。最終問題が 36 点なのは流石に何かを間違えていると思う。

本戦まで

文化祭で一週間前まで多忙だったためなかなかバチャを走る時間がなかった。2016 年と 2022 年のものだけちゃんと書いて、あとは目で解くのに留めておいた。

どうやら開会式に間に合わない新幹線のチケットが渡されていたらしいというワクワク情報が前日に流れてくる。

第 1 日(競技以外)

遅刻するのはまずいので新幹線を少し早いものに変更した。11 時半頃に会津若松に着いた。郡山と会津若松って割と距離あるんですね。

会津大学に着いてから割とすぐに開会式があった。僕はギリギリ間に合ったが、anmichi さん(とぺんぎんさん)がお昼ご飯を食べていたら間に合わずにチーム紹介の時に変な感じになってしまった。

競技が終わったあと、順位表凍結時点で 1 位だったので暫定 1 位の風船をもらった。大きくて持ち歩くと割と視線を集めていた気がする。

競技が終わると PCK の 20 周年記念の交流会があった。人と話をしてカードに名前を書いてもらう仕組みだったが、時間がそこまでなかったので名乗りあって終わりの人が多かった気がする。いつもの人たちとはいつものように会話した気がする。

第 1 日(競技)

役割分担は決めていなかったので、本番直前に慌てて決めた。anmichi さんに前の方の問題を順に解いてもらって、僕は 8 番以降を順に読むことにした。

8 番を読む。難しい。

9 番を読む。難しい。

10 番を読む。そこまで難しくなさそうということだけ確認して次に進む。

11 番を読む。すぐに解ける。ここで精神的には一安心。

8 番を読み直す。必要十分条件がわかって、 N が小さいので 3 乗の DP でも通りそうということだけ確かめた。細かい遷移は一切考えずに次。

9 番を読み直す。やっぱりわからない。

ここら辺で相談をして、とりあえず 11 番を書いて欲しいということだったので、書く。エディタの無能さにびっくりしながら書いて、AC。

10 番を考える。操作を行うごとに数列の総和が  X-(N-1)Y 増える。 X\neq (N-1)Y の場合は簡単。 X=(N-1)Y の場合は...できそうだな!くらいのノリで書き始める。WA。

相方も 6 番で WA を出して苦しんでいそうだったので、デバッグに参加。少し時間はかかったがバグが見つかり、通る。

自分も相方に 10 番の解法を説明すると、数列の総和が  0 かどうかの判定を忘れていたことがわかった。ひどい。通る。

残りが 7,8,9,12 番だったが、7 番は明らかに沼だったので 8 と 9 に手をつける。8 番は解けていたので概要だけ相方に投げて自分は 9 を考えた。2 次元のハッシュでいけそうという話になり、頑張って実装すると 1WA を出しつつも通った。

残りは 7 と 12 で、12 が解けそうになかったので 7 を並列実装することにした。なんとか終了 5 分前に通った。

結局前半と後半で大きく分けた形になった。多分正解の戦術だと思う。12 は他チームの話を聞く限りどう頑張っても実装が間に合わなさそう。

第 2 日

モバイル部門のプレゼンを聞いたあとプログラミング部門の解説に行った。7 番の想定解が 1 年ずつ計算するもので驚き。僕たちは 2800 年を 1 周期として計算した。12 番は頂点に意識が向きすぎていたことを反省。

昼食の時間に人々と 4 番の話をした。https://manabitimes.jp/math/889 を教えてもらった。

表彰式があった。プログラミング部門の準グランプリだった。表彰は慣れていないものなので難しかった。たくさんの副賞を頂けてありがたい限り。

帰りは重い紙袋(もらったお土産や蟻本などがたくさん入っていた)を必死に運んだ。疲れた。もう少し鞄に入れれば良かった。

終わりに

僕はあと 2 年残っているのでどちらかでは優勝したいですね

ライブラリたくさん印刷していったのに一切使いどころがなくて悲しかった

会津大学の食堂の天井に飛んでいった風船、今ごろどうなっているんでしょう…

JOI'22 参加記

助けて〜〜〜〜〜〜〜

100-100-77-8-19 で 304 です、ボーダーか逆ボーダーかです、助けてくれ

2/12 まで

f:id:Forested:20220213195035p:plain

まあまあ埋めた、去年より明らかに強くなっているのを感じた。去年は逆ボーダーで落ちたので今年こそはという決意があった。

開会式

双子が双子スライドで説明しているのが面白かった(?)。プラクティス後に人々と Among Us をした。来年はもっと Among Us の練習をしてから本選に臨むことを誓った。

ABC に出ようと思っていたが AtCoder が落ちてコンテストが中止になった。縁起が悪いなあと思いながら寝た。今年も緊張で全然寝付けなかった。

2/13

7 時に起きて、 Wordle をやって YouTube を見てとだらだらしていたらちょうど良い時間になった。

1 番。まあこれは良いです。すんなり満点。

2 番。最初は言っていることがよくわからなかったが、わかればまあこれも。これの満点をとった時点で開始から 30 分くらい経過。遅くない?

3 番。これ難しくない?小課題がいっぱいあったので、考察を少し進めたらその都度小課題を通して解の正当性を確かめっていった。最後の小課題の解法、正直思いつく気がしなかったので、完全に実力不足です。

4 番。小課題 1 は自明、小課題 2 からは難しいけど 3 番に比べたらこっちの方がまだ可能性はあったかな... 少なくとも小課題 3 までは取れるべきだった、大反省

5 番。小課題 1 は自明、小課題 2 は 2 分考えれば解ける。 3 番わかって実装したんですが、 H>W のときに縦横を入れ替える処理が抜けていて、 TLE...

5 番の 5 点取れていれば春合宿進出確定だったので本当に悔しいです。さようなら

ちなみにその後の交流会(チーム戦マラソン的なもの)でもバグらせてチームに迷惑をかけました さようなら

305 点以上が 21 人わかっていて、 304 点が僕含め 9 人いるので、あと一人上にいたら人生終了、いなかったら人生再開です

 

2/14 追記:通りました 人生再開です 本当にありがとう

ABC050-D Xor Sum

D - Xor Sum

公式解説と(多分)違ったのでメモ あくまでメモなのでかなり適当です

 

考察

非負整数 x2^ d の位の値を x _ d で表します。

どのような非負整数の組  (u, v) を数え上げれば良いのかを考えます。

まず、 a+b=(a \ \mathrm{xor} \ b) + 2(a \ \mathrm{and} \ b) より a \ \mathrm{xor} \ b \leq a + b なので u \leq v \leq N です。

2^ 0 の位には他の位からの繰り上がりが無いので、 u _ 0 = v _ 0 が言えます。

さらに、任意の  i についてついて以下が言えます。

  •  (u _ i, v _ i) = (0, 0) のとき、  (u _ {i+1}, v _ {i+1}) = (0, 0), (0, 1), (1, 0), (1, 1)
  •  (u _ i, v _ i) = (0, 1) のとき、  (u _ {i+1}, v _ {i+1}) = (0, 0), (0, 1), (1, 0), (1, 1)
  •  (u _ i, v _ i) = (1, 0) のとき、  (u _ {i+1}, v _ {i+1}) = (0, 1), (1, 0)
  •  (u _ i, v _ i) = (1, 1) のとき、  (u _ {i+1}, v _ {i+1}) = (0, 0),(1, 1)

逆に、これらを満たしていれば  a \ \mathrm{xor} \ b = u, a + b = v となる非負整数の組  (a, b) が存在します。ここのあたりの説明は省略します。(それぞれどのような  (a _ i, b _ i) が条件を満たすかを考えると示せます。おそらく。)

あとは桁 DP によって答えが計算できます。

Submission #22272214 - AtCoder Beginner Contest 050

JOI'21 本選敗退記

第 20 回日本情報オリンピック本選に参加しました。 300 点で逆ボーダーです…。

f:id:Forested:20210216090330j:plain

予選

なんとか時間ギリギリで満点を取れた。B と C が普通に難しくて焦った。

 

本選

過去問はある程度埋めておいた。 Twitter のガチプロ達がもっと埋めているのを見て恐怖を感じた。

 

1 日目

自己紹介動画を観たりした。パ研合宿とかで知っている顔の人がたくさんいた。

今日は早く寝ろと言われたので 22 時に布団に入った。が、地震やら緊張やらで全く寝付けず、結局寝たのは 2 時半くらいだった。

2 日目

7 時前に起きた。 5 時間も寝ていないことになる。どうやら自身の影響で本選が 1 時間遅れるようなので、適当に Twitter で遊んでいた。しばらくして本選が始まった。

とりあえず 1 問目を読む。差を見ると解けて、まあ適当にやればよい。 10 分で正解。

2 問目を読む。全然わからなくて焦る。 とりあえず、ある雪玉が回収する雪の範囲は区間になる。隣り合う雪玉の相対的な距離が同じ時は同じ形になるから…とか考えていたら解けた。 30 分くらいかけた。

3 問目。こっちは 2 問目よりも方針が立ちやすかった。予め任意の人 [i, j) に対して転倒数 + α を求めておけば DP ができる。とりあえず前計算を適当に O(N^3 log N) かけて計算し、小課題 3 までをとる。 j を固定して i をずらしていけば O(N^2 log N) で求まることに気づき、書いて満点をとる。途中まで永続セグメント木が必要だと勘違いしてずっと TLE & MLE と戦っていた。

3 問目簡単だったし 300 点だと落ちるだろうな〜と思いながら 4, 5 問目を読む。どっちの小課題 1 も全くわからないまま終了。解説を聞いたら問題 5 は割と近いところにいた。悔しい…

解説や交流会などに界隈で有名な強い人がいっぱいいて、すごいなあという気持ちになった。(小学生並みの感想)

交流があまり得意ではないので、そんなに交流しなかった。 HTTF から何も成長していない。

終わりに

ところで気づいたら人生が破滅しかけています 助けて

HACK TO THE FUTURE 2021 for Youth 参加記

HACK TO THE FUTURE 2021 for Youth に参加しました。参加記です。

予選

「マラソンコンテスト楽しそうだな〜」くらいのノリで出ました。この時のマラソンの実力ですが、焼きなましもビームサーチも書いたことがないレベルの超初心者です。マラソンコンテストに出たこともほとんどありません。よく 8 時間コンテストに出ようと思いましたね。

 とりあえず問題を読みます。適当に 0 から 99 まで順番に回収したら初の正の得点を取ってしまいました。

 次に、サンプルのように 1 から k を巻き込みながら 0 を回収することを考えます。貪欲に一番近いところにあるカードを回収して 0 の近くに置いて順番に回収をします。 k は全探索します。これを全てのカードが回収できるまで繰り返します。

最後の 1 時間くらいは巡回セールスマン問題みたいな感じで 1 箇所に集めようとしていたんですが、焼きなましが下手すぎて全く上手くいきませんでした。おいおい

結果、 155203 点で 155 位でした。ユース枠で本戦に通ってしまいました。いいんですか?

服とかお菓子とか色々もらえました。競プロで物をもらえるのは初めてだったので嬉しいです。

本戦

問題が他の年の本戦に比べて幾分もとっつきやすそうでした。とりあえず全て採掘するコードを投げたあと、しばらくいい感じのスコアが出る解を探していました。結局、まだ残っている塊の中で一番利益が大きいものを選び掘るという方針に落ち着きました。こいつ貪欲しかしてねえな

距離を考慮に入れたりパラメータ調整をしたりして、結局 2001552 点で 36 位でした。うう...

実は方針はそんなに悪くなくて、コンテスト後に少しだけ直して提出したら 2529856 点が出ました。ああああああああ

懇親会

 Twitter で知っている強い人が実際に生きているのを見れた(いやオンラインだから生きているのを見れたとは言えないのか?)のは楽しかったです。

解説を聞いていたらほとんど懇親をしないまま終わってしまいました 懇親が下手

おまけ

 一人だけ悲惨なことになっている写真があったらそれは僕です。ごめんなさい...