碓氷峠越え (2023/08/22)

碓氷峠(旧中山道ルート)を徒歩で越えました。

碓氷峠とは?

群馬県(横川駅付近)と長野県(軽井沢駅付近)の県境に位置する峠です。1997 年までは在来線の信越本線が横川駅と軽井沢駅を結んでいて、急勾配で知られていましたが、長野新幹線の開業に伴い在来線は廃線となりました。現在では JR バス関東による代替輸送が行われています(片道 520 円)。

経路

碓氷峠を越える経路として大まかに 3 つのルートがあります。

出典:国土地理院ウェブサイト

A ルート

国道 18 号の新道です。車での通行はこの道が主となっていて、JR バスもこの経路です。山道特有の蛇行が見られて見た目以上に距離が長く、距離は約 22 km となっています。

B ルート

国道 18 号の旧道です。旧信越本線も主にこちらのルートであり、横川から熊ノ平あたりまでは廃線に沿って歩いて行けるようです。距離は約 16 km で、碓氷峠を徒歩で越える場合はこちらがメジャーなルートとなっています。

C ルート

峠の湯あたりまでは B ルートと同じですが、途中から旧中山道に入ります。旧中山道は舗装はされておらず、完全な山道です。今回は横川から軽井沢方向にこちらのルートで行きました。

台風の影響

一週間ほど前の台風 7 号の影響で国道 18 号旧道の路肩が滑落して通行止めになっているという情報を前日に得て、元々このルートで行く予定だったところを急遽旧中山道ルートで行くこととなりました。18 号は現在でも復旧の目処が立っていないようで、一刻も早い復旧をお祈りします。

峠越え

横川駅から旧中山道入口

横川駅を 10 時頃に出てすぐそこにあるアプトの道に入ります。

アプトの道入口

その後は廃線跡(現在では碓氷峠鉄道文化むらの列車が走っている)に沿ってひたすら歩いて行きます。

廃線に沿って歩く。stand by me っぽさがありますね(?)

こんな感じで平坦な道を歩いて行くと峠の湯に着きます。峠の湯は第 1・3 火曜日は定休日となっていて、この日はドンピシャでした。気を取り直して近くの力餅の店で食事をし、店の方から旧中山道の話を色々聞きます。雨が降った直後なのでヤマビルが大量発生しているが、刺されても吸ったらすぐ剥がれるので平気ということでした。そんなこんなで割と楽観的な気持ちで旧中山道に入ります。

中山道入口から刎石山

11 時 50 分頃に旧中山道に入ります。入るとすぐに急傾斜の山道が広がり、30 分くらいはひたすら登り続けたでしょうか。開始 10 分くらいで同行していた友人がヒルに刺されて奇声を発しているのを見てほくそ笑みます。

中山道入口。入ってからしばらくは急斜面が続く。

ひと段落すると覗というスポットがあります。標高も入口では 500 - 600 m くらいだったのが、800 - 900 m くらいまで上がり、安中市街地を見渡すことができます。このあたりで靴紐を結び直そうとしたときにヒルが指にくっつき、冷や汗をかきます。

覗から見える安中市街地の景色

刎石山から熊野皇大神社

ここから先は傾斜も緩く歩きやすい道がしばらく続きます。ここから 1 時間ほどは淡々と歩き続けていたので、友人がヒルに吸われて呻いていた以外の記憶があまりありません。途中からは流れている小さい川の上を進んでいくことになり、大雨の影響もあってか何度か足場が崩れることもあって歩きにくい部分もかなりありました。

平坦な道

途中に大きい川があったので、そこで友人のヒルの処理をすることに。最初にひっついていたヒルは肥大化していて閲覧注意状態になっていましたが、木の枝で 1 つずつ丁寧に剝がしていって水で洗うということをしました。ここでようやく私の足にもヒルが複数くっついていることに気づきます。時すでに遅し。

水がきれい

この後はまた急勾配が続きます。県境を目指してひたすら登り続けて、少しきつくなってきたかというところでついに出口が見えます。

ゴール確定演出

14 時 20 分頃に軽井沢側の熊野皇大神社に着きます。山を出ると急に涼しく観光客も多くいたので、別世界に来たようでした。近くのベンチに座って足に引っ付いたヒルを引っぺがす作業をひたすらやっていたら観光客に変な目で見られたのを覚えています。

熊野皇大神社から軽井沢駅

ここから先は舗装された下り道なので完全にウイニングランです。駅前の通りでアイスを買って食べたり、公園の水道で傷口を洗ったりと思い思いに過ごしながらだらだらと軽井沢駅まで向かいました。軽井沢の雰囲気も少し味わえたので良かったですね。駅には 16 時 30 分頃に到着し、無事に横川軽井沢間の踏破に成功しました。

ゴールの軽井沢駅

ヒルについて

症状

靴下は長めのものを履いていきましたが、結局左足右足 11 箇所ずつの合計 22 箇所を刺されました。やつらは靴下の上からでも全然刺してくるので要注意です。また、靴下の上まで這い上がって刺してきた箇所もありました。上半身は T シャツ 1 枚でしたが全く刺されませんでした。私は鈍感なのか、痛みやかゆみ(なんなら刺されている感覚も)は全くありませんでしたし、夜まで出血が止まらなかったくらいの症状で済みました。友人は踝までの靴下だったので刺されまくっていて、膝や腹まで刺されていて大変そうでしたが症状も出血以外は特にという感じでした。

対策

ズボンの裾を靴下の中に入れることで内部への侵入は防げます。また、靴下も隙がないものが良いと思われます(具体的にはわからず)。食塩も持ち歩いていると安心でしょう。

クマーについて

戦わずして勝つ。真面目な話、あの狭い道で遭遇したらどうしようもない気がします。私は爆音で曲を流していました。

感想

当初はめがね橋を経由するルートで観光みたいな感じで行くことを考えていたのでまさかこんなヒルに刺されることになるとはという感はありますが、やってみればどれも一局という感じで楽しめたとは思います。今度来るときは 18 号旧道経由で行きたいですね。紅葉のシーズンはかなりきれいらしいです。

まとめ

山は厳しい。

第8回 SQLコンテスト (2023/08/19)

第 8 回 SQL コンテストに参加しました。

SQL コンテストとは?

PG BATTLE で使われる TOPSIC で開催されている SQL 界の 4 問 ABC みたいなコンテストです。7 月に tabr くんから存在を聞いて、それ以降少しずつ過去問を埋めたりして勉強しています。コンテストは 8/18(金) 12:00 から 8/21(月) 12:00 の間のうち、任意の 1 時間で参加できるという形式でした。

現状の実力

コンテスト開始前までに過去 9 回のコンテストの 1,2,3 問目の合計 27 問目を解説 AC も込みで埋めました。1,2 問目は余裕を持って解けて、3 問目は時間を書ければ解けることも多いという感じです。やりたい操作をどうコードとして書けばいいのかすぐに思い起こせないことがまだ多いです。

コンテストの振り返り

問題 1

これは簡単です。WHERE 句を使ってあげれば良いです。すぐに AC できました。

SELECT
    MEMBER_ID AS ID,
    SCORE1 - SCORE2 AS DIFF
FROM
    CONTEST_RESULTS
WHERE
    ABS(SCORE1 - SCORE2) >= 20
ORDER BY
    DIFF DESC,
    ID DESC

問題 2

一見 SUM を使うだけに見えますが、同一日の注文は 1 件とカウントするというところが面倒です。本番では WITH 構文を使って強引に通しましたが、解説を見ると DISTINCT を使えば簡単に書けるようです。

WITH TMP_TABLE AS(
    SELECT
        ORDERS.CUST_CODE AS CODE,
        ORDER_DATE AS DATE,
        CUST_NAME AS NAME
    FROM
        ORDERS
        INNER JOIN
            CUSTOMER ON CUSTOMER.CUST_CODE = ORDERS.CUST_CODE
    WHERE
        ORDER_DATE BETWEEN '2023-07-01' AND '2023-07-31'
    GROUP BY
        ORDERS.CUST_CODE,
        ORDER_DATE
)
SELECT
    CODE,
    NAME,
    COUNT(*) AS CNT
FROM
    TMP_TABLE
GROUP BY
    CODE
ORDER BY
    CNT DESC,
    CODE DESC

問題 3

まずはグループごとに平均を計算して、平均以上の人数の平均を取ればよいです。コンテスト本番のときは、平均以上の人数の割合を計算するのに、(平均以上の人数) / (全体の人数) で計算する必要があるかと思っていたのですが、普通に AVG 関数を使ってあげれば良かったです。CASE 句や複数のキーによる INNER JOIN を書いたことがなかったので、調べたりしながらなんとかコンテスト 10 分前くらいにはサンプルの数値が合うところまでいけました。しかし、このあと GENDER を数値から文字列に変更するのと、パーセンテージを小数第 1 位まで表示して % をつけないといけません。まず、GENDER の方については先程と同じく CASE 句を使えば良いということに 5 分程度で気づきます。次に、パーセンテージの方ですが、数値を VARCHAR 型に CAST して +'%' するコードを書いていたものの % は表示されず、ネットで検索したものを試してみても解決できず、ここで時間切れとなりました。コンテスト後に SQLite の構文表示を見たところ、文字列の結合演算子+ ではなく || であることを知りました。最後に付け忘れていた WHERE 句を付けるなどして無事 AC となりました。

WITH TMP_TABLE AS(
    SELECT
        AGE,
        GENDER_CODE,
        SUM(
            CASE CATEGORY_CODE
                WHEN '10' THEN AVERAGE_VALUE
                ELSE 0
            END
        ) AS H_SUM,
        SUM(
            CASE CATEGORY_CODE
                WHEN '10' THEN 1
                ELSE 0
            END
        ) AS H_CNT,
        SUM(
            CASE CATEGORY_CODE
                WHEN '20' THEN AVERAGE_VALUE
                ELSE 0
            END
        ) AS W_SUM,
        SUM(
            CASE CATEGORY_CODE
                WHEN '20' THEN 1
                ELSE 0
            END
        ) AS W_CNT
    FROM
        SCHOOL_HEALTH
    WHERE
        SURVEY_YEAR = '2019'
    GROUP BY
        AGE,
        GENDER_CODE
)
SELECT
    SCHOOL_HEALTH.AGE,
    CASE SCHOOL_HEALTH.GENDER_CODE
        WHEN '20' THEN 'MALE'
        ELSE 'FEMALE'
    END AS GENDER,
    ROUND(H_SUM / CAST(H_CNT AS FLOAT), 1) AS H_AVG,
    CAST(
        ROUND(
            SUM(
                CASE
                    WHEN CATEGORY_CODE = '10' AND AVERAGE_VALUE >= ROUND(H_SUM / CAST(H_CNT AS FLOAT), 1) THEN 1
                    ELSE 0
                END
            ) * 100.0  / (H_CNT * 1.0), 1
        ) AS VARCHAR
    ) || '%' AS H_PER,
    ROUND(W_SUM / CAST(W_CNT AS FLOAT), 1) AS W_AVG,
    CAST(
        ROUND(
            SUM(
                CASE
                    WHEN CATEGORY_CODE = '20' AND AVERAGE_VALUE >= ROUND(W_SUM / CAST(W_CNT AS FLOAT), 1) THEN 1
                    ELSE 0
                END
            ) * 100.0  / (W_CNT * 1.0), 1
        ) AS VARCHAR
    ) || '%' AS W_PER
FROM
    SCHOOL_HEALTH
    INNER JOIN
        TMP_TABLE
        ON TMP_TABLE.AGE = SCHOOL_HEALTH.AGE
        AND TMP_TABLE.GENDER_CODE = SCHOOL_HEALTH.GENDER_CODE
WHERE
    SURVEY_YEAR = '2019'
GROUP BY
    SCHOOL_HEALTH.AGE,
    SCHOOL_HEALTH.GENDER_CODE
ORDER BY
    SCHOOL_HEALTH.AGE DESC,
    SCHOOL_HEALTH.GENDER_CODE DESC

問題 4

開いていません。また今度やろうと思います。

結果

14:32 で問題 1,2 の 2 完で 166 人中 48 位でした。

tabr くんは全完で優勝していたので実力差を見せつけられる形となりました。

感想

問題 3 はほぼ正解のところまで行っていたので、間に合わなくて悔しいです。ただ、CASE 句や複数キーの INNER JOIN、文字列の結合方法など、SQLの文法に関して新たな知識を多く身に着けることができたのは良かったです。タイピングが遅いのとデバッグの手間があり、コンテスト中はかなり時間が経つのが早いという印象があったので、そのあたりも改善していきたいです。

まとめ

次回は 3 完以上します。

DELI下AIR太郎

発掘してしまったので供養...。

経緯

ICPC 2022 アジア横浜大会のチーム紹介スライドです。スライド作るの結構難しいと思うので今後の参加者の参考にもしなれば嬉しいです。改めて見ると誰も知らないであろうチーム名の由来も入ってて意外と悪くないかという気もしています。でも多くの人はおいしい庄内空港を知らないでしょうか。

作為

形は山形県で、目みたいな部分がおいしい庄内空港の位置に当たります。「革命起きてる」は torisasami 語録で、2022 国内予選当日に本当に革命が起きてしまうなんてこともありました。名前は某有名競技プログラマの本名を参考にしています*1

なぜ

ネタがなかったので、torisasami くんのアイコンの手書きの地球を真似して適当に山形県を手書きしてたら顔っぽく見えてしまったのが敗因です。おいしい庄内空港の位置もいい感じの場所にあったので歯止めが利かなくなってしまいました。

裏話

1 日目のチーム紹介で登壇するときこのスライドの話をちょっとしようかと思ってたのですが、torisasami くんが全くマイクを渡してくれなかったのでできませんでした。しかし、某下さんが笑いながらこのスライドを撮っている様子が壇上から見えたので、一応作った甲斐があったかなと思いました。その一方で torisasami くんは大真面目に優勝目指してると公言していたので、色々な意味で恥ずかしかったです*2

まとめ

今年のスライドはどうしようかな...。

*1:初出

https://atcoder.jp/contests/ttpc2022/standings/team

*2:実際にコンテスト本番は恥ずかしい結果に終わりました

AtCoder 入赤 (2023/07/02)

ARC 163 で赤になりました。

 

 

感想

率直に嬉しいです。5 月くらいまでは赤になれるとは思っていなかったので、しばらく実感がなかったのですが、最近銅冠も達成してようやく実感が湧いてきたので、現状分析も兼ねて記事を書くことにしました。

精進についての考え

基本的にこれまで、自分に足りない力を補うためには何をすればいいかを考え、目的に則した精進方法をやってみるという方法で一貫してやってきました。例えば、構築を鍛えたいと思ったら yukicoder の構築問題や過去のコンテストで苦戦した構築問題に取り組んでみたり、早解き力を上げたいと思ったら codeforces のバチャをやるといった具合です。そのため、コンテスト本番参加についてはあまり重視していないです。

具体的な精進方法

星は個人的な橙から赤になる上でのおすすめ度です。

codeforces div.1 バチャ ★★★★☆

黄色時代から合わせて codeforces round 200-300 の div.1 を全部やりました。codeforces は全体的に、発想一発というよりは細かいステップがいくつかあるような問題が多いという印象があり、見た目は解けそう(典型っぽそう)なのに意外と大変な部分問題が出てくることが多く、そのあたりで部分問題を頑張って押し通す力がついたかと思います。バチャをやっていくにつれて解ける問題も多くなり、時間内に全完できたことも何回かあったので、成長を感じられたという点でも良かったです。よく誘っては一緒に走ってくれた torisasami くんにはこの場を借りて感謝します。

yukicoder 本番参加 ★★★★☆

毎週金曜日に開催されているコンテストに特に用がなければ参加するようにしています。定期開催・大体日付が変わる前に終わる・日本語ということで、とても参加しやすいコンテストです。writer も毎週様々で、ABC-like なコンテストから adhoc 要素の多い高難易度のコンテストまで幅広く練習ができます。そろそろ自分も作問しなければという思いもあります。

JOI 難易度 10 埋め ★★★★☆

今年の 3 月に JOI 春合宿オープンコンテストに参加し、JOI が面白いなと感じたことをきっかけに始めた精進です。難易度を色々見た結果、難易度 9 は割と簡単に解けて難易度 11 はだいぶ難しいという印象だったので難易度 10 に取り組むことにしたのですが、ギリギリ自力で解けるみたいな問題が多かったのでかなりいい練習になりました。特に、もともと得意ではなかったグラフやデータ構造についての知識や汎用性の高いテクニックを増やすことができたと思います。また、いい実装練習にもなり、ARC や 5h などで実装重めの問題があってもそれほど苦ではなくなりました。難易度 11 を埋めてる人はすごいなと思います。

Library Checker 埋め ★★★☆☆

ライブラリを作ったり盆栽したりするのが好きなので、楽しく取り組めました。現在 113 問を AC していて、ランキングでは 13 位なようです。競プロではアルゴリズムを勉強して実装したけど verify できないというのはよくあるシチュエーションだと思うので、それを verify できる環境があるというのはありがたい限りです。この Library Checker 埋めでは、特に数え上げ分野を埋めることで畳み込みの立式の仕方や FPS の使い方についての理解が深まり、ABC や ARC でもかなり効果が出ていると思います。今後はまだあまり手を付けられていないグラフ分野についても勉強したいです。

ABC 埋め ★★★☆☆

8 問体制になって以降の ABC については現在全問 AC しています。Ex 問題については自力ではどうにも手が付けられない問題も多くあるので、わからなかったら解説をじっくり読みながらという感じでやっています。Nyaan さんなど ABC の解説は非常に充実しているので、行間を埋めながら読んでいくだけでもかなり勉強になります。8 問 ABC の本番参加時の全完率は 1/3 程度なので、これからは 4,5 割全完できるように知識レベルを上げていきたいです。

ARC - E・F upsolve ★★☆☆☆

ARC の 800 点以上は考察・実装の両面で難易度が高く、D まで 1 時間以内で解いた上で筋の良い考察をできないと厳しいという印象です。ただ、じっくり考えれば自力で解けるということも多く、F 問題は数学っぽい問題も多いので楽しく upsolve できています。赤になる上では 700 点以下の安定感を出す方が重要だと思っているので優先度はそれほど高くないですが、今後は高難易度へのアプローチ力強化という面で積極的にやっていきたいです。

なぜ赤になれたのか

わかりません。ぼちぼちやり続けてきた精進の成果、ただ単に自分にとって解きやすい問題が Rated コンテストに集中したなど色々あると思います。ただし、最近確実に上がっていると実感している能力があり、それは筋の悪い解法に進んでいるときに立ち戻って考え直す力です。以前と比べて方針の良し悪しを判断する精度・速度が上がったのが最近の調子につながっているのではないかと思います。

現状の得意・不得意分野について

コンテストのパフォーマンスの分散はかなり小さい方だと思っているので得意・不得意はそんなにないつもりではいますが、列挙するとこんな感じです。

  • 得意:bit operation 系の問題、dp、中難易度の早解き
  • 不得意:データ構造、グラフ、実装(タイピング)、高難易度へのアプローチ

勝手にライバル視しているプレイヤー

橙時代から特に意識していたプレイヤーについて、失礼ながら勝手に書かせていただきます。ちょうど 1 年前くらいはこの 3 人と自分を含めた 4 人でレート 2600-2700 くらいでかなり競っていたので、誰が最初に赤になるのか(あるいは誰もなれないのか)みたいなことを想像していたりしました。現状でも実力はかなり拮抗していると思うので、より上の舞台でまた戦えたら嬉しいなと思っています。

torisasami くん

ICPC DELIAIR のチームメイト。教養学部時代のクラスメイトで競プロのことを色々教えてもらい、今でもバチャを一緒に走ったり、コンテストの後の感想戦を二人でしたりととてもお世話になっています。自分が黄色になってからはかなりいい勝負をしていて、常に負けたくないプレイヤーの一人であり、一方で torisasami くんが活躍していると嬉しいという面もあります。

chinerist さん

ICPC The Raspberry Candies 所属。2022年の前半に急速に力をつけてきてあっという間に抜かされてしまったという印象があります。ARC での 3200 perf 率が非常に高く、高難易度へのアプローチ力を見習いたいです。作問も面白い問題が多く、AGC の writer をするなどとてもすごくて尊敬しています。

Kite_kuma くん

ICPC SPJ 所属。将棋が強いことで高校時代から名前を知っていました。競プロ始めたときから伸びが著しく、一学年下ながら自分よりも常に先を行っているという印象があります。AtCoder で 2774 まで行ったときは素直に赤になってほしいと応援していました。最近は調子を落とし気味かもしれないですが、実力はそんなもんじゃないと思うのでまた頑張ってほしいです。

その他近況報告

ICPC

今年度の ICPC は国内予選 5 位でアジア横浜大会へ参加できることが決まっています。最近はチームの各人の実力向上に加えて適切な役割分担をできるようになったため、Universal Cup や multiuni などの 5h コンテストでも良い成績を出せるようになってきています。横浜大会では昨年より上を目指せると思うのですが、US 配列キーボードについてはかなり懸念しています。

学業・研究など

卒論は結構いい感じの結果を出せて今年の 5 月に学会発表もしました。学会では他大学の研究者の方に結構褒めていただいたりして嬉しかったです。一方で研究室が変わって大学院での研究は行き詰まり気味なのでもっと頑張らないとなあと思っています。

インターン・就活

6-7 月に 1 社のインターンに参加し、8 月末からもう 1 社、10 月からもう 1 社で合計 3 社のインターンに参加する予定です。AtCoder jobs を使ったり使わなかったりで業務内容も様々な予定です。既に参加したインターンでは、CS 系の知識がなさすぎてすみません...という気持ちになったので、最近は視野を広げて色々取り組むようにしています。就活で受けるところについてはそろそろちゃんと考えます。

脱純粋培養に向けて

最近は tabr くんに色々教えてもらって SQL コンテストや HTML・javascript (react)、ネットワークの勉強などに着手しています(大変感謝しております)。あとは UNIX コマンドを日常的に使うように意識したりしています。赤になって精神的に余裕が出てきた面もあるので、今後はできることを少しずつ増やしていきたいです。

将棋

やってないです。藤井七冠が八冠になるのを指をくわえて見ています。AtCoder でいうとレート 2500(?) くらいのところで引退してしまったのですが、今は競プロの精進方法の知見があるので昔とは違ったやり方で取り組めるかなという感じはあります。ただソフト研究みたいなのはあまり乗り気ではないです。

まとめ

今後は競プロ以外も頑張ります。

ICPC 2022 国内予選 (2022/07/08)

登場人物

  • torisasami

チームのリーダー的存在。先生。tokusakurai とは前期教養時代のクラスメイト*1。研究室振り分けで第 14 希望に配属され、最近は研究室での話をよく聞く。卒業に向けて頑張ってほしい。競プロでは初手の考察の筋の良さに定評があり、高難易度問題をあっさり処理してしまうこともしばしば。

  • sapphire15

torisasami と ICPC 出たいねという話をしていたところに駆けつけて来た救世主。サファ先。チームの良心である。いわゆる「パソコン」やコンピュータサイエンスにも造詣が深く、いつも助けられている。競プロでは主に構築問題や AGC などの adhoc 要素の多い問題を得意としている。

  • tokusakurai

筆者。チームの中では知識枠(?)。寒色時代に torisasami に手取り足取り競プロを教えてもらったが、最近では口癖までうつってしまっている。チーム戦では他の 2 人が途中まで考察して詰まっている問題を寄せ切って美味しいところだけかっさらうハイエナプレイを得意としている。

チーム名

チーム名決めをしているときに「おいしい庄内空港」と言ったら 2 人にウケが良かったので delicious airport で "DELIAIR" に決定。他にも全員が 9,10 月の秋生まれであることから "Fall Guys" という案もあったが、ありきたりすぎるということで却下された。去年の PG BATTLE で 2 位だったんですが、結果発表のときに "おいしい庄内空港" を見て某社長が「何これ」みたいに言ってたのを許してません。

本番まで

(普段デスクトップでやっているのであまり行く気はなかったが)一週間前くらいに対面でやるかを打診したところ sapphire15 が部屋を取ってくれて急遽行くことに。そのためにノート PC に json をそのままコピペするなど付け焼刃の環境構築をして準備した*2。当日は 13 時すぎに家を出て駒場に向かった。電車の乗り継ぎがあまりにもスムーズだったのでラッキーだなあと思いつつ 14 時前に駒場に着くと sapphire15 が既に着いていて書籍部の前で合流した。もう 2 年以上来ていなかった駒場に懐かしさを感じる、ということはなかった。その後書籍部で数学書を見たりした後借りていた部屋へ向かい、noimi が院試の出願の締め切りを勘違いしていないかという話題で sapphire15 と盛り上がっていた。時刻はまもなく 15 時になっていたが 2 時間前に準備をしていたはずの torisasami がまだ来ない。心配になって LINE をするもこれから電車に乗るところだったようで、「まじめにやって」*3と送った。そうこうしている間に torisasami が到着し、学生選手権のオンサイトに通るかなどの雑談をしていたら気づけば 10 分前になっていた。

作戦

学内での競争が激化している中で、全体 10 位に入らずして国内予選を突破するのはほぼ不可能だろうということはわかっていた。昨年一昨年の結果を見るに 6 完できればおそらく通るという感触はあったので、基本的にはそこが目標になると思っていた。完数を増やす上では早めに後ろの方の問題にも目を通しうまく分担する必要があるので、 torisasami に先に C 以降をみてもらうことにした*4。結局開始時の作戦は以下のようになった。

  • sapphire15 がサクッと A を通す
  • tokusakurai がサクッと B を通す
  • torisasami が C 以降の問題を見て、やりやすそうな問題をやる

本番

16:30:00 開始

実は本番開始 1 分前頃から急にトイレに行きたくなっていた。本当は本番前に行こうと思っていたのだが、部屋を出たところでちょうど torisasami に鉢合わせたことで行くのを忘れていたのだった。例年通りコドフォったらその隙に行こうなどという甘い考えをしていたのだが、その期待は裏切られまさかの定刻スタートとなった。sapphire15 から A が解けるという声が上がり、torisasami からも今年の C は簡単だという声が上がる。その一方で自分は B 問題の読解に苦戦していた。

16:34:37 A 問題 AC (sapphire15)

ようやく B 問題も読めてきて、1 周すれば 1 枚は減る的なことが問題文に書いてあったので愚直にシミュレーションすれば良いっぽいことがわかり、実装に着手する。saphire15 は D,E を見比べて、D が torisasami の得意分野である数え上げということで E に向かうことになった*5

16:37:53 C 問題 AC (torisasami)

torisasami が C を爆速で通し、なんと暫定首位に躍り出る。後から見れば、C 問題で FA を取った Aobayama_dropout と 13 秒差でかなり惜しかったようだった。torisasami は sapphire15 に託された D に向かう。その後数分して何とか B の実装が終わるが、サンプルで Segmentation Fault が取れず、早くも追い込まれていた。デバッグの仕方を sapphire15 に教えてもらうも gdb が入っていないことを怒られ、結局コードを共有してデバッグをしてもらった(本当にありがとう)。無事に mod を取り忘れてる箇所があることが発覚し、事なきを得る。

16:53:27 B 問題 AC (tokusakurai)

2 人に次何をやったらいいかを聞くと、sapphire15 から E のチェッカーを書いて欲しいという依頼があったので、問題を読んでチェッカーを書き共有する。その後 D 問題に取り組む torisasami から「長さ N の数列に含まれる長さ 1,\dots,K の増加部分列の個数の数え上げが高速にできるか?」と聞かれる。O(NK\log N) より速い解法がわからなかったので、どうしてその問題に帰着されるのかを聞いてみたところ帰着される問題が別の問題であることが発覚し、解決した。

17:28:36 D 問題 AC (torisasami)

sapphire15 が E で少し苦戦してる感じだったので話を聞くことに。F 問題が簡単だった場合のリスクが大きいということで torisasami にはひとまず F に行ってもらう。このあたりで torisasami が 5 完早解きできればかなりアツいという*6。E の今考えている解法を聞いたところ、どうやら乱択を考えているようだった。黒板を使ってとりあえず確定するところを埋めてみたいな実験をしてたところ、どうやら解法の整理がついたらしく、ひとまずここは任せることにした(正直なところ、解法が非決定的なところもあってかなり不安視していた)。F に取り組む torisasami からも 3 乗 から落ちないという相談を受けるが、問題をよく見ると構文木のノード数は 333 以下なので 3 乗でも間に合うと主張し、自分が構文木構築パートを実装し、メインパートを torisasami に実装してもらうことに。苦戦しながらもしばらく実装していると sapphire15 から E の勝利宣言が出る。

18:16:52 E 問題 AC (sapphire15)

ありがとうサファ先。サファ先神。信じ切れなくてごめん。この時点で暫定 5 位でノーペナでタイムも良く、さらに F 問題も解けそうということで国内予選突破にかなり近づいていることを感じていた。なんとか完成した構文解析パートを torisasami に渡し、sapphire15 とH 問題を考える。永続木がどうこうと言われるが、気分が高まっていることもあり何のことだか理解できなかった。その間に torisasami が実装を終えてテストケースの実行に入るが数分待っても終わらないという。コードを共有してもらって落ち着いて見てみると、再帰でメモ化をしていないことがわかり、それを指摘すると実行が終わるようになる。これで一件落着かと思いきや、今度は WA が出る。出力を見てみると空文字列になっているところがあり、文字数計算パートのミスも発覚する。*7

19:00:00 順位表凍結*8

現状 6 位だが、確実に通すためにはもう 1 完が欲しい。その後も F を提出しては WA を繰り返し、3 ペナまで行ってかなり焦りはあった。そこでとりあえずサンプルを自分で作ることを提案し、実際に ?(?(?(?(a)a))cba) で cb が返ってくることがわかり、それが直るまで色々修正していると今度こそ通る。

19:18:43 F 問題 AC (torisasami)

気が付けば辺りはすっかり暗くなっていた。最後に 10 分くらいあったので GH を考えたり、順位表を見て抜かれそうなチームがあるかを考える。幸い E までがハイペースだったので 6 完で抜かれうるチームがほとんどなかったこともあり、この時点では全員いけると思っていたと思う。

19:30:00 終了

3 人で揃って torisasami のパソコンの前に集まり、緊張しながら F5 を押す。

終結

終結果は 6 完 (25808) で総合 7 位、学内 4 位でした!

最終順位表抜粋

最後の F 問題の AC が順位に影響しなったのは少し残念なところもありますが、5 完以下に終わる強豪チームも結構いるので 6 完したという結果はとても良かったと思います。

終了後

torisasami の鍵垢を覗くと、どうやら noimi や nok0 さんなどと打ち上げをしようとしているらしい。自分は飲めないし noimi に何されるかわからないしいいかなという感じだった。その後も torisasami のアカウントで勝手にツイートして怒られたりするなどしてグダグダしてるといつの間にか 20:30 を過ぎていた。他の部屋(競プロ関係ない)に遊びに行っていた sapphire15 も帰ってきて、一週間くらい前から行きたいと言っていたサイゼに行くことになった。サイゼで豪遊*9した後はもう 23 時前になっていて、自分はもう疲れたし帰るかといって 2 人と別れたが、2 人はその後 noimi らの飲み会に行ったらしい。みんな楽しかったと言ってるし、せっかくだからちょっと行ってみた方が良かったかもしれない。学内 ICPC 参加者の方はまた地区予選のときよろしくお願いします。

終わりに

チームメイトの torisasami と sapphire15、コーチの enjapma さん、ICPC 運営陣の方々、一緒に戦った他チームの参加者の方々など、みなさんありがとうございました。特に個人としては 1 問しか通してないのでチームメイトの 2 人には迷惑かけたと思います。厳しい戦いでしたが何とか結果を残せて本当に良かったです。

*1:実は noimi も同じクラス

*2:まじめにやって

*3:torisasami 語録の 1 つ

*4:昨年は C からかなり険しかった

*5:これがなかなか好判断だった

*6:終わってみればこれは正確な見立てだった

*7:このあたりの話は https://twitter.com/torisasami4/status/1545668395433349120 が詳しい

*8:実際は順位表凍結はなかったらしい。え?

*9:これで 2000 円かからないから安いものです