halcの競プロ精進ブログ

はるくが競プロしたことを書き留めるなにか

【参加記】JOI 2023/2024 参加記 (後編)

JOI23/24の参加記です。春合宿です。雑です。躊躇なくネタバレします。

また、記憶の捏造があるかもしれません*1

春合宿前

特段特殊な精進はしてなかったはずです。難易度10を少し埋めたり遅延セグ木の空書きとかはしました。

というので、本選前よりは精進してないと思います。

Day0

交流会

いろんな人と話しました。楽しかった。

紙でタワーを作る大会がありました。この積み方で思ってた数億倍安定してて笑いました。*2

ラクティス

実機を触る練習をしました。一応しっかり書き留めておきます。

1問目

入出力高速化をするだけです。scanfprintfは嫌なのでios::sync_with_stdio(false);cin.tie(nullptr)でどうにかしました。

2問目

愚直にやっても間に合うという話はどこかで聞いたのですが、なんか80点しか取れんかった。

周り全員ちゃんと満点かと思いきや、80点の仲間が少しいて安心しました。*3

3問目

恥ずかしい話をすると、解けませんでした。馬鹿かな?

スタックに積む、よく考えたらそれはそうで泣く

周りに煽られまくりました*4

4問目

コミュニケーションの練習をするだけです。

知らなくていいC++: std::minmax_element #ゆっくり解説 - YouTube をやります。

5問目

コミュニケーション(ry

長さ16以下の01文字列は217-1個あるので、AliceとBobで同じ方法で生成して、数字を対応させればいいです。

6問目

どうみても巡回セールスマン問題です。適当な山登りで88点。これ以降はめんどくてやってません。

Day1

コンテスト中

開始し、適当に問題を流し読む。fish3とspy3の題意は理解したが、ski2は訳が分からなかった。fish3は自明部分点の64点がとれるめどが立つ。

VSCodeの設定をするが、F5キーの設定ができない。20分くらい格闘したが無理で、諦めて手打ちでなんとかすることにする。

fish3を実装する。当初の予定通り64点を手に入れる。ただ、その先はわからずspy3を考える。

とりあえずすべての辺の重みを送る8点解法は自明。各クエリごとに各辺を使うか使わないかを送るのを考えたができる気がせず*5、仮にできたとしても20点程度でコスパが悪い。というわけで、ski2に戻ってみる。

考えると、4乗っぽいDPが浮かぶ。各地点の標高をたかだか1mしか上げないことを仮定すると3乗になったため試しに実装したが、サンプル1の時点で嘘だった。

そうなると、高さを保留する必要があることに気付いて、そうすると3乗か怪しくなってしまう。いったんは実装して提出するが、答えが全く合わない。いろいろ試すが、真相はINFが大きすぎてオーバーフローしていただけだった。直すと最後の小課題以外は取れる。しかし、最後の小課題はセグフォっていた。

4乗になりそうだったが軽いことは確信したので、いろいろ調整する。そして、満点を獲得した。

fish3の満点が思い浮かぶ気がしなかったので、いったんspy3の8点を確保する。しかし、その後の成果はなかった。

64-8-100、合計172点で終わり。

コンテスト後

順位表が配られました。5位(!?)でびっくりしました。適当に緩く楽しむつもりだったのに、真面目にやらないといけなくなってしまいました。

ただ、fish3の満点が取れなかったことが悔しかったです。意外と簡単だった…

Day2

コンテスト中

とりあえず問題を流し読む。昨日と違ってどれも可能な見た目でない。とりあえず天才ゲーっぽいtricolorを考える。

F5キーで実行できるようにするのはあきらめて、それ以外を設定した。compile.shがただコピペするだけのものに見えていたが、それをたたくとコンパイルできることに気付いてびっくりした。

暫く考えて、隣り合う2つのライトをうまく光らせれば0,1,2のどれも表せることに気付いた。左端が奇数か偶数かわかれば解けそうだったが、その方法がわからず諦める。

boardgameを少し考えたが17点しか取れるめどが立たない。まだしっかり考えてないvegetables5を考える。

とりあえず愚直を書いて、ソート順にマッチングしていいことを確信する。小課題4について考えると、答えで二分探索すればその中で二分探索して行けそうであることに気付く。なんなら満点も取れそうだったが、実装が破滅しそうだったのと、大きさが相違なる制約がないのがめんどくさそうで諦めた。

小課題4を1時間くらいかけて書く。恐ろしいほど実装が重かったが、何とか書き上げて提出。しかしTLEが出る。

中で4回二分探索していたのだが、それを半分にすると間に合う。答えを合わせるために、1回の二分探索で2つの条件について調べることにした。すると何とか通った。

とりあえず、boardgameの10点を取ろうとした。しかし、3点しかもらえない。原因を探したが見つからない。諦めてtricolorに逃げた。しかしtricolorもわからず、適当な15点くらいの解法を投げるが1点も入らず終わってしまった。

3-0-67、合計70点というかなりお粗末な点数となってしまった。

コンテスト後

だいぶ絶望してたのですが、なぜか順位は1つ上がって4位(!??)、なんと代表圏内に入ってしまいました。

ごはんが一番おいしい日でした。*6

Day3

コンテスト中

いつも通り問題を流し読む。どれも絶妙に解ける見た目をしていて困る。

とりあえずcollectionを考える。しばらく考えて、各数を「目標の数」「それより大きい」「それより小さい」とまとめることでO(N3)の区間DPが思いつくが、そんな小課題はなくて困る。いったん飛ばすことにした。

towerを考える。A=1,B=Dをとりあえず解くことを考えると、頭が壊れそうだが前から順番に更新できそうだった。いったん書いてみて、答えを合わせる。しかし1ケースだけ通らなかった。表示の場所的にそれは小課題1だと考え、小課題1を書くとなんと通ってしまった。

joitourを考えてみると、いかにも愚直を書いてくださいと言わんばかりの小課題たちが待っている。とりあえず書いて20点。

そしてパスグラフはセグメント木に乗せるだけなことに気付いた。頑張って空書きして通す。

もう時間がなかったので、collectionのN<=20を通す。towerの嘘解法を書いて無事0点が帰ったところで終わり。

11-36-30、78点。昨日よりはいい点数だったので、まあ大丈夫だろうと思っていた。

コンテスト後

順位表が配られました。すると、6位に落ちてしまっていました。それだけならまだしも、5位と50点程度の差がついてしまい、逆転できるわけないと絶望しました。fish3の36点とboardgameの14点を悔やみ始めました。

自分もほかの人たちも、上位5人の争いになると考えていたと思います。

双子たちが最終日で100点差が覆った話をしていました。ただ、実力差がありすぎて自分がそれをできるとは思っていなかったです。

いろんなボードゲームをしました。楽しかった。

Day4

コンテスト中

なんとかして50点以上の差をつけないといけなくて絶望するが、とりあえず問題を読む。すると、なんか全部解けそう。

とりあえず、islandを考える、3Nまでは思いつきそうだったが、確信が持てない。いったんescape2を見てみる。すると、どう考えてもダブリング。左から行くだけだと計算量にMがかかってまずいが、両方からやってメモ化するとルートが付きそうで、満点をとれるめどがたった。

とりあえず左からだけやって、想定通り54点を得た。大変だったが、右からも書いて満点。

islandを書く。すると、N2までしか取れなかった。それを適当に枝狩りすると、3Nに落ちてくれた。しかし、2Nをかけるめどは立たなかった。

tabletennisを考えるが、きれいな性質が思いつかない。上界もわからない。しかし、山登りすればなんかN<=20とかは行けそうな気がしてきた。

そこそこバグらせたが、N<=20を通した。すると、結果を見るとN<=150が通せそうだったので、いろいろ調整して150まで通した。

そのあとは何の成果もなし。

100-72-62、234点。ワンチャンは見えた。

コンテスト後

順位表を見る前に、周りの人にネタバレされました。3位だったので、解析の時間にひっくり返らなければ勝ちでした。めっちゃびっくりしました。

解析でひっくり返ることもなかったので、代表が確定してしまいました。うれしい。

ところで

  • 非負整数X10進法で表したときの各桁の数字の和をf(X)とします。*7真面目にやります。
  • 田園都市線、平日の朝だと怖いくらい混むぞ
    • 準急は論外としても、各停ですらだいぶ混んでるよね…
    • 満員電車だし池尻大橋駅で誰も降りないし運悪くドアと反対側にいたしで降りるのが間に合わないかもしれなかった、なんとか降りれたが…
  • 流星コネクト ver2023 by Losstime Life - YouTubeって神曲ですよね、ずっと脳内で流れてた
  • ピュレグミ美味しい
  • ラムネグミのシート、食べれるんだね
  • SET セットカードゲーム | ANALOG GAME INDEXっていうボードゲームをとあるチューターの方が持ってきてたんですが、めっちゃ楽しかった*8

おわりに

楽しかったです。IOIもがんばります。

*1:ただ覚えてないだけですが

*2:ちなみに順位はそんなだった。悲しいなぁ

*3:安心していいことではない

*4:平和ですね

*5:実は復元できます

*6:物理的な話です

*7:https://atcoder.jp/contests/iroha2019-day1/tasks/iroha2019_day1_h

*8:参加者側のとある人がSETを無双してて笑いました

【参加記】JOI 2023/2024 参加記 (前編)

JOI23/24の参加記です。本選までです。雑です。

一次予選たち

流石に楽勝でした。絶対需要ないので何も書きません。RTAしたり、3回目で1時間くらい存在を忘れていたりしました。

綺麗なフラグ回収ですよね、これ

二次予選

流石に通るとは思っていましたが、通らなかったら恥ずかしいなんてレベルじゃないので、結構緊張していました。

以下、小課題1のことを①と表記します。他の小課題も同様です。

1問目 (0:00:56)

setに想いを乗せて希望の風に乗ります。

2問目 (0:06:13)

絶対そんなわけないと思いながらも、BITに想いを乗せました。時系列順に処理すれば、計算量がひどいことになることもないです。

想定は二分探索らしいです。うん、絶対バグるのでBITで正解ですね。

3問目 (0:12:55)

ちょっと面食らいましたが、余るものが絶対区間になると気づけば消化試合です。DPでよいです。

絶対2問目より簡単じゃないですか、これ。2問目は難易度6に、3問目は難易度5.5に投票しました。

4問目①② (0:48:35)

急に殺意高くないですか?

結構考えましたがいい性質が見つからず、とりあえず5乗の自明枠を書きました。

5問目①②③ (1:24:05)

4問目は普通に考えてもわかる気がしなかったので、5問目に移りました。

が、変な嘘に気が付いてしまったあげく実装できませんでした。自明なのと、計算が容易な③を書きました。

4問目④ (1:48:16)

戻りました。赤の場所がとても多いので、赤以外の場所が中心なものを全探索するのは余裕です。

赤だけのものの最大値は、最大正方形の問題と同様にDPで求められるので、それを書いて提出しました。

結果

4問目⑤を考えましたが盛大にバグらせ、この後は何の成果も得られずに終わりました。

結果は374点。結構いい点数ではありますし、突破はほぼほぼ確約されているようなものですが、同レート帯からするとカスな結果*1で落胆します。

解説を見ました。4問目が天才でした。翌日すぐに通しました。*2

こんなんでも無事に通過し、本選への挑戦権を手に入れました。

~本選

3問目で詰まって敗退する悪夢を数回見ました。怖い。

正夢にならないよう、難易度9を調べものとライブラリ禁止で結構埋めました。得たものは多い気がします。*3

難易度7を埋めなさすぎですね…

本選1日目~2日目

ガイダンスに参加しました。自分の自己紹介を見るの恥ずかしすぎる。

その後の交流会で、95/100を獲得して2位でした。最終問題で、チームメイトが導出した答えがあってたのに自分が導出した間違った答えを提出してしまい、萎えます。

その後、最大人数のGarticPhoneが行われました。誰とは言いませんが強い人が数回お題を捻じ曲げる大戦犯*4をしてて、「あ、この人も人間なんだな」と安心しました。

本選前日、tatyamさんの本選模擬に参加しました。しかし、2問目の満点が取れず落胆します。

ちなみに、答えで二分探索でした。気づけよ。

典型を最終確認し、翌日に備えました。

本選2日目

絶対に通りたかったですが、去年中2本選落ち黄コーダーがいたのでめちゃくちゃ不安でした。

1問目 (0:22:31)

昨日見た、答えで二分探索が見えました。しかし、実装難を感じました。

頑張って実装して提出したものの85点。WAかと思ったらTLEだったので、QCFiumをするも得点は上がらず。毎回vectorを作らず、再利用するようにして満点が取れました。

ちなみに、二分探索なんていりませんでした。ばーか。

2問目 (0:36:41)

1問目より簡単ではと思いました。すんなり方針は立ち、実装します。

実装後、未証明ですがなんか答えがあってうれしくなることに気付きます。提出して、一発で満点を獲得しました。

3問目① (1:04:26)

まじでなんもわかりませんでした。

一応しばらく考えて、左端に行く→右端に行くのような貪欲を思いつきました。

これが正しければセグ木で高速化できるなとか考えて、愚直を実装するが小課題1しか通らず。そんな…

悪夢が現実になりそうで焦りました。

暫く考えても正しい方法はわからず、4問目に移動しました。

4問目 (2:50:54)

見た当初は何もわかりませんでした。3問目も5問目もわかっていなかったので、本選落ち黄コーダーになることを覚悟しました。

しかし、マッチングといえばのHallの定理を思い出し、愚直で判定できる必要条件を見つけました。

何回か使ったことがあって信用できるWavelet Matrix | Nyaan’s Libraryを借り、愚直を実装して50点。点数は想定していたので、解法が正しいことを確信しました。

ここで、このコードの一部を抜粋します。

    rep(i,Q){
        int L,R;
        cin>>L>>R;
        L--;
        string ans="Yes";
        rep(j,L,R){
            if(bw.range_freq(L,R,A[j])-1<aw.range_freq(L,R,B[j])+1){
                ans="No";
            }
        }
        print(ans);
    }

ここで、awAをWaveletMatrixにしたもの、bwBをWaveletMatrixにしたものです。

また、range_freqはWaveletMatrixの関数です。

私は、この部分に注目しました。

bw.range_freq(L,R,A[j])-1<aw.range_freq(L,R,B[j])+1

これが、

bw.range_freq(L,R,A[j])-aw.range_freq(L,R,B[j])<2

移項するとこうなって、

bw.range_freq(L,R,A[j])-aw.range_freq(L,R,B[j])<=1

この値は明らかに整数なのでこうなって、

bw.range_freq(L,R,A[j])-aw.range_freq(L,R,B[j])==1

この値が0になることはありえないのでこうなります。

この式の条件を考えると、[B,A]の区間がほかの人と重ならない人がひとりでもいたらNoという、あからさまに答えな条件に気付きました。

各人に対して、そのような条件を満たす左端は遅延セグメント木で計算できます。右端もです。

あとは、クエリ先読みをし平面走査のようなことをして提出し、満点を獲得します。長かったですが、一気に勝ちを確信します。

3問目②③ (3:01:25)

とりあえず、bitDPで書けるところは書きました。

N\leq 100 を考えましたが、区間DPがちらついたものの糸口はつかめませんでした。

5問目①② (3:24:42)

まあボス問なので何もわかりません。とりあえず、適当な01BFSを書きました。

結果

3問目を一生考えていたものの、もう何もわかりませんでした。

結果は100-100-24-100-16。Dの満点のおかげで勝ちを確信します。

解説を聞きましたが、3問目はやはり区間DPでした。気づきたかったなぁ…

ちなみに、N\leq 500000 の小課題の本質には気づいていました。区間DP気付いてたらワンチャン3問目の満点を取れたのか…

まあ4問目の満点取れたし、ヨシ!

しっかりと通過していたので、春合宿への切符を手に入れました。

おわりに

本選まででもすでに楽しかったです。春合宿は、行けたら後編にします。

いい成績をとって散るぞ!!!

*1:Magentorくんが強すぎる

*2:5問目は知りませんし通してません

*3:02/04時点

*4:ちなみに、この強い人はちゃんと春合宿に行きました

【今日の精進】JOI春合宿バチャ Day5 (番外編)

毎日格上の問題を倒すやつの100日目です。*1

コンテストリンク

https://kenkoooo.com/atcoder/#/contest/show/d7702885-8ae7-43b8-b7c9-16ea14a53752

結果

ジョイッターで友だちをつくろう(難易度11…0/100(---)

刑務所(難易度11)…0/100(--------)

チーム戦(難易度10)...73/100(oooooo-)

合計...73/300*2

解法

E - ジョイッターで友だちをつくろう (Making Friends on Joitter is Fun)

なにこれ

A - 刑務所 (Jail)

なにこれ

F - チーム戦 (Team Contest)

小課題2までは、二匹を固定して残りの一匹は彼らの長所より小さい中で、もうひとつが最大のものを選べばよいです。累積maxをとれば、これは実現できます。

小課題6までは、二能力の数値を固定すれば、これも累積maxなり累積minをとっておけば最適なものを選べます。

提出コード

チーム戦

atcoder.jp

感想

いまだに1問も満点が取れないのどうしたものか

*1:え…!?

*2:一問だけしか解けなかったにしては…?

【今日の精進】JOI春合宿バチャ Day4 (番外編)

毎日格上の問題を倒すやつの99日目です。

コンテストリンク

https://kenkoooo.com/atcoder/#/contest/show/d7702885-8ae7-43b8-b7c9-16ea14a53752

結果

ビ太郎の旅(難易度9)…15/100(oo--)

イノシシ(難易度12)…62/100(ooo-)

旅行(難易度11)...7/100(--o---)

合計...84/300*1

解法

L - ビ太郎の旅 (Bitaro's Travel)

Q=1 の場合は、訪れる場所が区間の形になるものを利用すればシミュレーションできます。

それ以外はちょっと知りません。

L - イノシシ (Wild Boar)

T=1 の場合は、各頂点と最後に通った辺のペアをもった最短経路をすべてに対して持っておいて、あとはいい感じにシミュできます。

それ以外は知りません。

I - 旅行 (Tourism)

小課題3は、左端と右端を求めるRMQ(どっちも)をすればよいです。正直その前の愚直も厳しいです。

提出コード

ビ太郎の旅

atcoder.jp

イノシシ

atcoder.jp

旅行

atcoder.jp

感想

イノシシの T=1 を全部とれたのが相当大きかった

*1:少しよろしくない

【今日の精進】JOI春合宿バチャ Day3 (番外編)

毎日格上の問題を倒すやつの98日目です。

コンテストリンク

https://kenkoooo.com/atcoder/#/contest/show/d7702885-8ae7-43b8-b7c9-16ea14a53752

結果

図書館(難易度9)…19/100(o-)

美味しい美味しいハンバーグ(難易度12)…2/100(o---o---)

掃除(難易度12)...12/100(o-o--)

合計...43/300*1

解法

K - 図書館 (Library)

各ペアを全探索すれば答えは出て、それで小課題1は通ります。2は知りません。

B - 美味しい美味しいハンバーグ (Hamburg Steak)

K=1 の時は自明で、(もっとも右にある左端、もっとも下にある上端)に刺せばよいです。それ以外は知りません。

C - 掃除 (Sweeping)

小課題1は愚直で解けます。

小課題3は、常に座標の制約を満たすことが証明できるので、区間更新一点取得のセグメント木を使うといい感じに更新できます。

提出コード

図書館

atcoder.jp

美味しい美味しいハンバーグ

atcoder.jp

掃除

atcoder.jp

感想

弱すぎる

自明な小課題がすべてコスパ悪く…

*1:は…?_2

【今日の精進】JOI春合宿バチャ Day2 (番外編)

毎日格上の問題を倒すやつの97日目です。

コンテストリンク

https://kenkoooo.com/atcoder/#/contest/show/d7702885-8ae7-43b8-b7c9-16ea14a53752

結果

治療計画(難易度11)…0/100(----)

航空路線図(難易度10)…37/100(oo-)

ふたつの交通機関(難易度11)...6/100(o------)

合計...43/300*1

解法

L - 治療計画 (Treatment Project)

小課題1はセグ木、小課題2は全探索でできるけどどっちも実装したくない

G - 航空路線図 (Airline Route Map)

頂点を追加で N 個用意すればもとのグラフのIndexを復元できそうです。実際は二進数にすればよいですが実装したくないです()

F - ふたつの交通機関 (Two Transportations)

小課題1は最短経路アルゴリズムで解けます。ほかは知りません。

提出コード

航空路線図

Submission #48857822 - JOI 2017/2018 春合宿 過去問

ふたつの交通機関

Submission #48858611 - JOI 2018/2019 春合宿 過去問

感想

最悪に弱い

*1:は…?

【今日の精進】JOI春合宿バチャ Day1 (番外編)

毎日格上の問題を倒す*1やつの96日目です。

暫くこれです。ちゃんとAtCの格上も解いてはいますが。

コンテストリンク

https://kenkoooo.com/atcoder/#/contest/show/d7702885-8ae7-43b8-b7c9-16ea14a53752

結果

道路の建設案(難易度10)…65/100(ooooo-)

鉱物(難易度12)…40/100(ooo------)

最古の遺跡 3(難易度12)...0/100(---)

合計...105/300*2

解法

E - 道路の建設案 (Road Construction)

45度回して、求めるものをチェビシェフ距離にします。

すると、各点の距離の下界はX座標の差になります。これを利用します。

暫定トップを持っておいて、距離の下界が小さいペアから順に暫定トップを更新していきます。これは優先度付きキューを使用すればよいです。

わざわざ下界を設定したのは、これを考えておくとよさげなところで枝刈りができるからです。

ただ、この方針だと最後の小課題は何しても通りませんでした。

L - 鉱物 (Minerals)

小課題1

全探索です。

小課題2

すごく意味深です。

これは、前半と後半に分けて例えば並列二分探索を利用すれば解けます。

小課題3

ペアがないなら自分で作ればよいです。これはそんなに難しくありません。

ただし、この後はこの方針だと厳しそうです。

F - 最古の遺跡 3 (Ruins 3)

なにこれ、全探索もできません…

提出コード

道路の建設案

atcoder.jp

鉱物

atcoder.jp

感想

10-12-12は本番だと相当な虐殺回では?

*1:ほんとか?

*2:あまりにも微妙