日記 9/16–9/30

9/16

応用情報

4.2 節を読んだ。今日情報の授業で気づいたけど、情報の教科書読んでおくだけで割と対策になるんじゃないか?

9/17

応用情報

飛行機の中で 4.3 節を読んだ

9/18

IOI2022 International Study Camp

Study Camp という名の観光
午前中にあった Huawei 社の方々によるスピーチでは社内での AI 関連の研究について説明していただいた。大雨の中撮った映像から、雨を除去した映像を生成する話が面白いと思ったが、前提知識もリスニング力も足りておらず十分に理解できなかったのが残念

応用情報

ノートを丁寧にとるのは諦めた。4.4 節から 4.6 節までを読んだ

9/19

IOI2022 International Study Camp

朝 9 時に外に出て、夜 10 時半に帰ってきた 午前中はいくつかの講義 + Huawei のオフィス見学 午後は NUS キャンパス見学 + Gardens by the Bay 観光 あまりに充実している

9/20

IOI2022 International Study Camp

セントーサ島散策、Vivo City、マーライオンなど 夕食時に NUS に熱烈勧誘を受け気持ちが揺らいだ (海外の大学、奨学金が豊富すぎて…)

競プロ

溜めていた記事を読んだ

木上の等高線集約クエリ (by suisen さん) 重心分解で 1 点更新区間取得 (by noshi91 さん)

↓この記事も途中まで読んだ

マージテクと高さ O(logn) のマージ過程との融合 (by Nachia さん)

マージの方法を定式化して分類したり、重心分解をある種のマージテクと捉えるという考え方は自分にはなかったので勉強になった

9/21

応用情報

4 章を読み終えた。待ち行列理論の話、証明もなしに公式を出されたのでモヤッとした

作問

いい感じの簡単枠が生えた

9/23

競プロ

AHC014 にようやく手をつけた。いつ提出できるだろうか

応用情報

5.3 節を読んだ

その他

LT 会の資料を作った
完全にただの旅行記になってしまった

9/24

応用情報

5 章を読み終えた
明日から電車で過去問道場やろう

その他

明日のあどれの夜ゼミで使うスライドを作った。誤植などは明日確認する
伊計島メンバーでオンライン夜ゼミがあった。LT でシンガポール旅行について話した
今回の夜ゼミは聞き専だった。毎回発見があって面白い

9/25

その他

体育祭 + あどれの夜ゼミ + お仕事 などなどで一日中忙しかった…
幸い、明日は休みなので色々頑張ろう

9/26

組合せゲーム理論

二週間ぶりの勉強会。特定のゲームについて全ての局面が number であることを示す証明手法や、dyadic rational number を効率よく計算する方法、switch が選択肢に含まれるゲームの比較・評価について学んだ

スプラトゥーン 3

S+ 昇格戦勝てない

9/27

競プロ

dyadic rational number を用いて解ける問題をもう一つ見つけたので解いた
 a + \frac{b}{2^{64}} という形で持つのが一番良さそうだという感想になった

問題 提出コード

class DyadicRational {
    using Self = DyadicRational;

    // a + b/2^64
    i64 a;
    u64 b;

  public:
    DyadicRational() : a(0), b(0) {}
    DyadicRational(const i64 a) : a(a), b(0) {}
    explicit DyadicRational(const i64 a, const u64 b) : a(a), b(b) {}

    Self operator+(const Self& t) const { return Self(a + t.a + (b + t.b < b), b + t.b); }

    Self operator-() const { return Self(-a - (b > 0), -b); }

    Self left() const {
        if (is_integer())
            return a - 1;
        return *this + -Self(0, b & -b);
    }

    Self right() const {
        if (is_integer())
            return a + 1;
        return *this + Self(0, b & -b);
    }

    std::pair<i64, u64> get() const { return {a, b}; }

    bool is_integer() const { return b == 0; }

    friend bool operator<(const Self& x, const Self& y) {
        return x.a < y.a or (x.a == y.a and x.b < y.b);
    }

    friend bool operator>(const Self& x, const Self& y) {
        return x.a > y.a or (x.a == y.a and x.b > y.b);
    }

    friend Self game(const Self& x, const Self& y) {
        if (!(0 < y))
            return -game(-y, -x);
        if (x < 0)
            return 0;
        if (x.a + 1 < y)
            return x.a + 1;
        if (const int msb = y.is_integer() ? 64 : 63 - countl_zero(x.b ^ y.b);
            (y.b << (64 - msb)) != 0) {
            return Self(x.a, ((x.b >> msb) + 1) << msb);
        } else {
            const int next = msb - countl_zero(~(x.b << (64 - msb))) - 1;
            return Self(x.a, ((x.b >> next) + 1) << next);
        }
    }
};

一年以上使ってきた自動メモ化ライブラリのバグ (今まで何度も使ってきたが遭遇しなかった) を今日突然踏んでびっくりした。std::decay を噛ませていなかったのが原因らしい…

その他

悩んでいた GCC のバグが治った。Xcode のバージョンを下げれば良かったらしい 参考

9/28

競プロ

部内で開く JOI バチャの準備をした
JOIG 春合宿で一番難しいと言われていた問題を解いた。難易度 8 だったが結構難しくて驚いた 問題 提出コード

9/29

競プロ

JOI バチャの解説を作成

応用情報

6.2 節まで読んだ
そろそろヤバくなってきたな

9/30

競プロ

JOI バチャを開催 + 解説を担当した バチャのリンク

ちなみに明日の ABC で Writer をしている (今週はこれで忙しかった)

応用情報

6.6 節まで読んだ
SQL 全くわからん

日記 9/4–9/15

はじめに

もともとは Zenn の Scrap に投稿していましたが、移転しました。

毎日何かしら学ぶことを習慣にしたいと思ったので、学んだ内容などをスレッド形式で記すことにする
本日ちょうど 17 歳の誕生日を迎え、キリが良いので始めることにした

9/4

組合せゲーム理論

明日の講義担当のため、Lessons in Play を読み進めて講義資料を作成
switches と呼ばれるゲームの勝敗の解析や、それをさらに入れ子にした  \{x | \{ y | z \}\} という形のゲームについて学んだ

パソコン甲子園

ルール確認とライブラリ整備

競プロ

ARC147 に参加した
全ての問題において解説がとても綺麗で悔しい

9/5

射影幾何

数研で講義担当だった。実射影平面の自己同型の例として一次変換を説明する…はずだったが、中三相手に行列や行列式の説明をしていたら時間オーバー

応用情報

合格教本を読み始めた。恥ずかしながら、平均情報量 (エントロピー) の定義を初めて知った

組合せゲーム理論

競プロ勉強会でも講義担当。Partizan Endnim の解析、無限小ゲームの解析、switches の勝敗判定などを説明した

9/6

競プロ

組合せゲーム理論で学んだ dyadic rational number を用いて AtCoder の問題を解いた
問題
提出コード
incentive が負であることさえ示せば、あとは実装するだけになる。面白かった
今まで勘違いしていたが、incentive は負か 0 と比較不可能かにしかならないことに気づいた

応用情報

オートマトン、形式文法、構文解析などの復習
グラフ理論や確率統計の話は読む必要すらなさそう

9/7

パソコン甲子園

去年の本戦の 1–10 を解いた。ペナが多かったので気をつけたい

応用情報

回帰分析まわりの勉強。偏相関係数を初めて知った
ロジスティック回帰や最尤推定まわりは大雑把な内容しか知らないので勉強したい

9/8

パソコン甲子園

去年の本戦の 11–13 を解いた。12, 13 が一発で通って嬉しかった

応用情報

合格教本の 1.8 節 – 2.7 節を読んだ。
新しく知った内容はほとんどない。強いて言えばプログラムの再入可能・再帰的・再使用可能・再配置可能という分類くらい

9/9

応用情報

2 章の終わりと 3 章を少し読んだ。2 章のアルゴリズム周りの話は簡単だったが、3 章以降は読むのが大変になりそう

スプラトゥーン 3

買ってしまった。すでに 4 時間くらいやった気がする
ゲームが致命的に下手なのをどうにかしたい

9/10

パソコン甲子園

予選。チーム KobLa として参加し、開始 120 分程度で二人とも全完した
本戦も優勝するぞ

スプラトゥーン 3

「次勝ったら終わろう」と決めてから負け続けて結局 30 分くらい延びた

応用情報

フリップフロップ回路は名前しか知らなかったが、今日初めて内容を理解した
小学生の頃はマイクラで回路のことを沢山調べていた覚えがあり、もしかすると今より詳しかったかもしれない

9/11

応用情報

3.1 節を読み終えた
覚えながら読み進めなきゃいけないので結構時間がかかる

群論

去年数研でやったけどちょくちょく忘れている部分があるので、雪江代数を読み直すことにした 今日は超基本的な定義を復習

圏論

伊計島セミナーで教えてもらった Basic Category Theory を読み始めた。Introduction の時点でかなり難しくて大変。未だに universal property がどういったものか掴めていない

競プロ

ARC148 に参加
E 解けなくて悔しい

9/12

応用情報

3.2 節を読んだ。ノート取りながら真面目に読んでると結構時間がかかるんだけど、あと一ヶ月切ってるので飛ばし飛ばし読んだ方がいい気がしてきた…

射影幾何

講義担当が中学生向けに線形代数を優しく教えていたので、内容的には簡単だった
線形変換が射影平面の自己同型であることの証明や、射影線形群の説明など

作問

1 問パッと思いついたものがあった。解けるかどうかはわからない

組合せゲーム理論

Tiny & Miny と呼ばれるゲームの定義や、infinitesimal な局面や switch が登場するゲームの例を扱った
個人的に Elephants & Rhinos というゲームの解析が面白かった

9/13

応用情報

3.3 節を読んだ。これからどんどん忙しくなるので今のペースだと絶対間に合わない。どうしよ

競プロ

昨日扱ったゲームと類似した問題が ARC に出ていると maspy さんが教えてくれたので、解いた
問題
提出コード

その他

伊計島セミナーで相部屋だった人に教えてもらった「奇書の世界史」シリーズを観てみた。面白かった

9/14

応用情報

3.4 節を読んだ

その他

会誌や夜ゼミの準備、W/T 作業など、意外と色々やることがある

9/15

応用情報

3.5 節、4.1 節を読んだ

競プロ

構築  O(N) クエリ  O(1) の RMQ を理解した。想像していたより簡潔だった

JOI 2022 春合宿 参加記

第 21 回日本情報オリンピックの春合宿に参加しました。

この記事は問題に関するネタバレを含むのでご注意ください。

誤字脱字はきちんと確認していません。

Day 0

去年と同じホテルに宿泊。春合宿の人数が増えただけでなく、JOIG も同時開催だったので、ホテル勢が 10 人以上いて驚いた。

Library Checker を埋めて心を落ち着かせようと思ったら、二重連結成分分解をバグらせた。与えられるグラフが連結だと思い込むいつものミスだった。

Day 1

ヨルシカの曲を大音量で体に流しこんでから出発。会場に着いたらいつものメンバーがいて懐かしさを覚えた。「今年こそはずっと 4 位以内を維持して代表になるぞ!」と意気込んで競技開始。

全問 Batch だった。去年のように一問目に Output Only が置かれていなくて安心。全問読んで、とりあえず設定が単純で部分点の付け方が雑な kyoto に取り掛かる。とりあえず自明 10 点を取る。小課題 2 の配点が 30 点と大きめなのでまずこれを取ろうと考えるが、一向にわからない。某難易度 12 のように DP の差分を取れば速くできるんじゃないか?などと思ったが、後から考えるとこの方針で進んだのが運の尽き。

解けないので数え上げの misspelling を読む。とりあえず与えられた条件を言い換えるとかなり単純になった。後ろから DP すればとりあえず部分点は取れるので実装した。その次の小課題の意味が全くわからないので、DP のコードをじっと睨んで高速化できないか考える。色々試行錯誤した上で満点が取れた。ひとまず安心。

jail を読む。見た目的に難易度 11 以上だろうと思った(が、結果的にはそうではなかったらしい)。トポロジカルソートのようなことをしたくなったが詰められず、26 点で止まった。

その後 kyoto と jail を反復横跳びしながら考察したが、一点も伸びなかった。悪い予感を抱えて競技終了。

実際ひどい結果で、jail に関しては下から数えた方が早かった。安心できる成績で代表になりたいとか言っていた人が 10 位を取ったらしい。 代表ボーダーとは約 60 点差だったが、去年 100 点差をひっくり返した経験があるのでそこまでメンタルはやられていなかった。

解説を聞いた後に言うのも変だが、jail は解けただろ

Day 2

2020 の Day 2 では 4 点、2021 の Day 2 では 42 点という悲惨な思い出があったので、今年こそは Day 2 でも成功したいと思った。

競技開始後、まずは全問を読む。team が簡単そうなので取り掛かる。とりあえず Θ(N2) を通して、しばらく考えると満点がわかった。一時間もたたずに一完することができ、大喜び。

Communication 課題である flights に取り掛かる。少し考えると 62 点解法がわかったので実装し、少しバグらせた後に取る。その後 copypaste3 の 30 点を取り、二問を反復横跳びしつつ flights を小手先の改善で 67 点まで伸ばした。75 点まではわかっていたつもりだったが、合わせることができず競技が終わった。

総合順位は 5 位と悪くなかったが、copypaste3 を解いている人が 5 人ほどいたことに驚いた。解説を聞いた後は確かに可能枠だと感じたが、競技中は全ての問題が難易度 12 に見えるので普段なら解ける問題も解けない。

copypaste3 と team は JOIG との共通問題で、なんと JOIG に team の満点がいたらしい。強すぎる

Day 3

去年 Day 3 で大成功したので今年も頑張るぞ〜と思いつつ競技開始。

二問目が木クエリ問なので取り掛かる。log のついた犯罪臭のする解法が頭をよぎったが、少し考えると計算量が良く実装も激軽な解法が浮かんだので実装する。前日に引き続き一時間も経たないうちに一完できたので安心する。

次に小課題が多めの device2 に取り掛かる。一時間以上考えても 10 点しかわからず、やばい。とりあえず 10 点を取って sugar を読む。小課題 2 までは取らなきゃいけないやつかな〜と思って考えるが、小課題 1 しかわからない。なんとその 6 点を取った後は一点も伸びなかった。合計三時間半くらい椅子を温めていた気がする。火事になってしまう

終了後順位表を見ると、device の 40 点や 80 点を取っている天才を除けば上位勢とほとんど点数が同じで安心した。しかし、激ムズセットでは点差が縮まらないため順位は 5 位のまま。代表ボーダーと約 40 点で最終日を迎えることとなった。HELP

夜に推しの歌ってみたが投稿されたのでループしながら寝た。

Day 4

あまり緊張せず競技に挑めた。根拠はないがなんとなく行ける気がしていた。追う側は失うものがない

全問読んだ後、dango3 を考えると 2 分で解法がわかったので実装。20 分で満点が取れた。 これは今年の春合宿を通して一番簡単な問題だろう、と思い、実質 200 点分で 40 点差を返さなければならないと考えて少し焦った。

fish2 を考える。考えなければいけない区間が O(N) 個しかないといういつものやつで 25 点までは取れた。

その後 reconstruction を考える。まず Q <= 20000 を通し、次に M <= 1000 を変な解法で通した。これだけで二時間使ってしまった。 しかし、よく考えると小課題を解くときに仮定していたことが実は必要ないとわかり、満点の解法を思いつくことができた。 100 分ほど残して 200 点を取ることができた。

その後は fish2 とタイマン。取得クエリしかない場合はなんとなく解けていたので、残り一時間になっても進まなかったらそれを詰めて実装しようと考えていた。実際残り一時間になっても進んでいなかったので、48 点まで伸ばして終了。

なんと Day4 単体では 1 位。総合 3 位に返り咲き、無事(?)代表になることができた。

結果

Day 1
jail : 26
kyoto : 10
misspelling : 100

Day 2
copypaste3 : 30
Flights : 67
Team : 100

Day 3
device2 : 10
sprinkler : 100
sugar : 6

Day 4
dango3 : 100
fish2 : 48
reconstruction : 100

Σ 697、総合順位 : 3 位
無事 IOI の日本代表になることができました。

感想

良かった点 :
全体を通して実装が簡単な方針を選ぶことができた。 メンタルがバカ強かった。

悪かった点 :
一日目から本調子を出すことができなかった

今年の問題は(易化したとはいえ)多くの参加者に解かれていて、実力のインフレを感じた。多分来年も今年と同じかそれ以上に緊張して挑むことになると思う。

APIO / IOI 頑張ります。

アジア太平洋情報オリンピック 2021 参加記

結果

47 + 100 + 100 = 247 点 Official Rank 2 位タイ(Gold)

めちゃくちゃ嬉しい!

やったこと

春合宿前に比べると精進量は落ちていた。 何度か外国 OI の 5 時間バチャをやったり、APIO の 2014 年以降の過去問を全て埋めたりした。

競技の流れ

0:00 ~ 0:10

問題文を印刷し、配布ファイルをダウンロード。全問に目を通す。

0:10 ~ 0:50

「各問について <30 分考察して難易度を見極め、どの小課題まで取れそうか考える」という立ち回りをすることは元から決めていた。

第一問 Hexagonal Territory

見るからにやばそうな問題。JOI 難易度 11 の Territory をめちゃくちゃ進化させたみたいな問題内容だったので、これは難易度 12+ だろうと目処をつけた。 15 分ほど考えたが、 B = 0 すら解けそうで解けない。

第二問 Rainforest Jumps

Hexagon よりはずっと人間的な見た目をしているが、20 分ほど考えても愚直以外の方法が思い浮かばない。どうせダブリングだろうとは思ったが各頂点から辺が二本あるのがきつい。

第三問 Road Closures

見てすぐ「木の問題じゃん!これは解きたいな…」と思った。 JOI 難易度 12 の Designated Cities という問題に若干似ていて、貪欲が効くのではないか?と考えたがダメ。

0:50 ~ 2:30

今年の問題は難しいと思い、少し焦る。 一時間経って 0 点はまずいと考え、とりあえず Hexagon の 9 点と Jumps の 4 点を取っておく。 しばらく Jumps と Road を往復したのち、Jumps を頑張って詰めようという選択に至る。

何とかしてダブリングが使える形に落とし込みたい。経験上、このような問題は貪欲によって戦略を絞ると単純な形になって解けることが多いと感じていたので、貪欲を考える。 30 分間くらい何も思い付かず焦ったが、 A = B, C = D の小課題を考えていると、「ゴールの高さを超えない間は、左右のうち高い方に登ればよい」ということに気づく。この時点で「この問題は解けるな」という謎の安心感を覚えた。  A = B, C = D だけを解いても点数的にそこまで美味しくないので、 A = B の制約がない場合も解いておきたい。少し考えるとスタート地点は一通りに絞れることが分かったが、それを高速に特定する方法が全然思い付かない。20 分ほど考えて、JOI の Scarecrows という問題で使ったテクニックを応用すれば解けることが分かった(実際はこのパートもダブリングできることがコンテスト後にわかった)。

ここまで来れば、満点はそう遠くなかった。とりあえず高速化していないコードで部分点が取れることを確認したのち、満点解法を実装した。 コンテスト時間半分が経過した時点でようやく緑色のランプが灯り、とても安心した。

2:30 ~ 3:50

Road を考察する。「各  k について愚直に解けたらいいのに…」と考えていたら、次数  k 以上の頂点のみに注目すれば調和級数の計算量になることに気づいた。 自分の木 DP 力 / データ構造力にはそれなりに自信があったので、ここまで来たら解けるだろうと信じる。

実装したものを提出すると、TLE。 TL が 1.0s だったので、「 log 2 つだとダメなのか…」と、春合宿の二日目にひたすら TLE に苦しまされ、一問に粘着した結果ろくな点が取れなかったことを思い出した。 しかしよく見るとパスグラフすら通っていない。パスグラフなら log は 1 つになるはずである。  k = N - 1, N - 2, \dots, 1, 0 についてループを回していたのを、 k = 2, 1, 0 に制限するとパスグラフの小課題が通った。 おかしいな…と思ってコードを見直すと、「次数  k 以上の頂点を格納する配列」が、随時 push_back していくつもりだったのに元々要素数  N 確保されていたことが分かった。 直すと AC になった。この時点で 209 点。これは勝ったろ!と思い勝利の舞を踊っていた(誇張)。

3:50 ~ 5:00

 B = 0 は取っておきたいな…と考える。六角形の移動は、傾きを変えて縦横斜めにすると考えやすいので、そのようにして考察する。 すると、 B = 0 はピックの定理で解けることが分かった。実装すると 36 点になって喜んだ。 残り 20 分だったので愚直 BFS を書いてさらに 11 点を取り、コンテストが終了した。

もうこれ以上は取れない、という実感があった。大満足だった。

感想

悔いなく実力を出せたと思う。 この調子で IOI も頑張ります。