パソコン甲子園2019本選参加記「AはDPのA」

予選の様子はこちらです。

private-yusuke.hatenadiary.jp

チームメンバーの簡単な紹介:

  • 自分(public_yusuke)
    • 元部長
    • ❤️💻。🇰🇷📖🔰。🔢↘😱(∵🏫🈴📝🕘, ¬🔢📝🕘)
  • 後輩(season)
    • 現部長
    • ❤️∫πΣ∞∇∂📖💪。🔢↗↗💪。

予選はだいたい1ヶ月前の9/14(土)に行われた。そこで運よく地域枠に引っかかったため、本選へ出場する運びとなりました。

参加前の話

予選の数日前に台風15号が千葉県に甚大な被害をもたらし、私や後輩も長期間の停電や断水の被害を被りました。「こんな状況の後で通るわけないよ」なんて思いながら予選に出たら、凍結時点で24位。千葉県では高専や他の高校を抜いて一位となり、地域枠をもらって本選出場することになりました。

受験勉強があったので私は一切精進しなかったのですが、後輩はコンスタントに400点ぐらいの問題を解いていました。

0日目

私の学校は東京から一時間半ほど離れた場所にあるので、学校から会津若松まで片道4時間半くらいかかります。そのため、金曜日は午後から公欠、いわば早退に近い形で早くから電車に乗ることになりました。
出発は1時半ごろで、会津若松駅に到着したのは17:54ごろ。

東京駅で、チーム「らてd」の@nn1k_さんと@Selfgrudgeさんに、新幹線を待っているとき物理的に接近しました(接近しているだけで、このとき会話はしませんでしたが後の選手交流会で例のエンカ特有のプロフ撮影をした)。


らてdの二人は新幹線で二列前に座っていました。

郡山に着いたとき新幹線から降りると外気の冷たさに驚きました。
郡山から会津若松までは、磐越西線でだいたい一時間半ぐらいかかりました。到着したらホテルのチェックインをすませたあと、顧問と後輩でステーキ宮に行きました。
その結果、夕飯は肉 also known as †人権†を食べられた!

とても美味しかった。予算を出していただいたうちの高校に感謝しかない。

その後はホテルに戻ってTwitterをチェックしていると、どうやら二階の休憩スペースに人々がいるようでした。そのため向かってみると実際数名の競プロerが集結していました。エンカ大会はまだありませんでしたが、強い人々の会話を聞くことができて楽しかったです。

また、E869120さんが製作したゲームをプレイすることができました。300点満点中200点以上を取れば殿堂入りできたのですが、惜しくも196点で、6位になりました。

↑これは偽で、筑駒のゲームでした……間違えてしまって申し訳ありません。*1

yukicoderのコンテストが開催される日でもあったためホテルのロビーにて参加しましたが、私は半年ぐらいまともに競プロをやらなかったため全く頭が働きませんでした。しかし後輩は二問ノーペナでACできるコードを書いていて、これは普段からABCのD埋め精進をしてたからだと思います。精進する任意人類は偉い。

コンテスト参加後は寝る準備をして、翌日に備えました。

↑睡眠失敗の図。

1日目

会津の朝は寒い。起床ACして、朝食会場に向かいます。寝癖がすごい人、エンカ済の人など、様々な高校生競プロerが同じ部屋にいて、彼らと一緒に朝食を食べました。

競技まで数時間あったので、顧問と鶴ヶ城に行きました。外はかなり寒くて、スマホで天気を調べてみると、7時ごろは外気温0℃程度。紅葉はもう終わりを迎える時期であるという情報をタクシードライバーさんから聞きましたが、ちょうどよい色合いになっていました。気候の様子は千葉県とは全然違っていました。ところで顧問は本業は地学の先生で、地理的な知識については長けていらっしゃる方だったのでガイドさんがついているかのような安心感がありました(?)。

展示物には韓国語表記されているものもあり、それらを読むのは楽しかったです。日本史は並の小学生よりも知らないという自信がある(そんな自信はいらない)のでそれなりの楽しみ方を探った結果こうなってしまいました。城内の雰囲気と白虎隊に関する展示、そして変わり兜の特質な見た目が印象に残っています。
あと実はここで高専生にエンカしたのですが、顧問が彼らに話しかけただけだったのでTwitterのプロフィール画面を見ることは叶いませんでした。そのためどこの高専の方なのか今もわからないままです。ぜひ把握したかったです……。

お土産を買ったあと、ホテルへ戻りました。

会津大学

11時ごろに会津若松駅前に停まっていたバスに乗車して、会津大学まで向かいました。大学入口にある例の「|会|津|大|学|」の看板を見たとき、ついに高校生競プロerの憧れの地に足を踏み入れる日が訪れてしまったのだと思ってテンションがとても上がりました。何せ競プロキャンプに行ったり東工大OCでオフ会した経験はあってもオンサイトは初だったのです。

この後に開会式がありました。偉い方のお話では「ここに来たことに満足せず最後まで本気で取り組んでください」とのことだったので気を引き締めました。式の後に教室に移動しました。どうやら昨年までの場所とは違うようでした。
ドキドキしながら部屋に入った瞬間、並べられた大量のコンピュータと風船を目にして「これがオンサイトなのか……!」と興奮しました。だって本当に風船があるし、それに周りには強い人もいるし。

席につくと机の上には二枚のディスプレイがあり、右側のディスプレイには「本選」と「もう一つの本選」の順位表が左から並んで表示されていました。左側のディスプレイにはキーボードとマウスが繋がった操作可能なコンピュータがあり、ここでコードを書いてコンパイル、実行、そして提出をします。また、書いたソースの印刷ジョブを投げることもできます。基本的には予選と同じUIでした。
しかしエディタやOSは普段使いのものとは違っていたため苦労しました。オートインデントが効かないTeraPad(実は設定すれば使える)は好きになれなかった。
またOSもWindowsだし使用するプログラミング言語C++で、私は普段Sublime Text 3, macOS, Dの組み合わせで競プロをしているのでいろいろ本選では手間取ってしまいました。

本選開始

本選開始のカウントダウンが進むにつれ、グッと緊張が高まりました。
5, 4, 3, 2, 1, ……ゼロ!開始してすぐログインフォームにIDとパスワードを入力・送信し、テンプレの入力まで行いました。その間に後輩が1問目を考察し終えたので、場所を交代。後輩がコードを書いている間に私が2問目を考え、大方の考察を終えました。後輩は一問目を難なくAC。
その後私が2問目のコードを書いたのですが、queueの存在を完全に失念していたので、実装に時間がかかってしまいました。いくら受験勉強をしているからって半年ぐらいずっと競プロしないで出場したのはマズかったなと反省しました。でも、一発でACできたのでok。この時点では12位でした。
私がコードを書いている間に後輩は3,4問目の考察を終えたとのことだったので、再び席を交代して私は5問目の考察に入りました。

しかし3問目を後輩が実装すると、int y1;と変数宣言しているにもかかわらず、y1+h1をしている箇所でdoubleのポインタがどうのという趣旨でC++特有の長いエラーが出ていたのでおかしいぞ、という話になりました。どう頑張っても直らないので、とりあえず一旦その問題は置いといて4問目をやることになって、それは無事にACできました。

3, 5問目……。

ここからが椅子の温め所(は?)。だいたい2時間半ぐらい一問も通せない状況が続きました。悪夢……。

  • 3問目 後輩
    • y1に対する謎エラーが出る
      • 原因: STLの変数と衝突してた。
    • それを直しても、サンプルは通るのだが提出してもダメ
      • コーナーケースを見つけたのだが対策してもダメ
  • 5問目 自分
    • サンプルは通るが(ry
    • その後1時間半ぐらい経ってやっと方針が間違っていることに気づく。

冷や汗が出ました。昨年の本選問題を練習で解いたときは5問目ぐらいまで難なく通せる印象があったのですが、これがうまくいかない。いくら考えても正解できず、焦りのみが大きくなるばかり。どんどん下がる順位に顧問も心配していたそうです。

このため終了一時間前ぐらいに「解く問題を交換しよう」と提案し、それぞれが各々の問題を考察し直すことにしました。ただし、このとき後輩には5問目のやるべきことを伝えておきました。

3問目は2つの長方形の左下の座標とwidth, heightが与えられるので、それらが重なっていない部分の面積を求めよ、という問題でした。後輩がどのように解こうとしていたかは覚えていませんが、私は「重なる部分のwidth, heightを求めて、その長方形の二倍の面積を、与えられた2つの長方形の面積の和から引けばいいな」と思い、そのように実装をしたつもりがWA。ヤバイ!!もう後がない!!なんて思って、ソースコードを印刷してもらい紙面上でバグ探し。すると、h1とh2が入れ替わってしまっている部分があったので、そこを直すと通りました。終了30分前ぐらいに通すことができて本当によかったです。
余談ですが、序盤の頃にソースコードを印刷してもらおうとジョブを2回ぐらい投げたものの、なかなか印刷物が手元に渡されてきませんでした。ただ待っていると無駄な時間が過ぎてしまうので質問を投げると、少し後に係の人が戻ってきて「もう一度印刷してみてください」と伝えたため指示に従うと、ソースコードが印刷された紙が数分後に渡されました。その後は依頼したらすぐに渡されるようになりましたが、序盤はそれで若干時間を奪われてしまいました。

5問目は後輩が実装を重ね、終了20分前ぐらいにACすることができました。これによって、順位表凍結時点(終了12分前)には29チーム中17位となりました。元々5完したいなと思っていたので、後輩が通したときは本当に嬉しかったです。
あの感覚は二度と味わうことはないといってもいいでしょう。初オンサイトで序盤から後半まで椅子を温めつづけるだけの状況から一転、最後ギリギリ二問通せた。本当に救われた気分だったし、ハイテンションになりました(心の中で)。競プロが「競技」プログラミングと呼ばれる所以が少しわかった気がしました。

その後6, 7問目の考察をしましたが、どちらもDPだろうということしかわからず終わってしまいました。7問目はbitDPで行けることすら気づけなかったので、これは反省すべきでした。また競プロを完全放棄して受験勉強しかしなかったという態度は、本気で取り組んでいた人に対して良くなかったと思い、反省しました。

順位表凍結についてなんですが、元々終了30分前ぐらいに凍結されているはずだったものの風船の配布は停止されても順位表の更新は依然として続いていました。これマズいのではと思っていたら終了15分前ぐらいにモニターの電源ボタンを押して消されるという超絶アナログな方法で順位表の閲覧をできなくする手段が取られたためビックリしました。他の競技者もこの件について質問していたものの即座に対策が取られることはなかったようでした。

普段と環境が違ったり問題が解けなかったりするととかなり焦るということがわかりました。それでもとりあえず5完できてよかったです。

選手交流会

競技が終了してすぐにホテルにバスで移動し、荷物を置いたあと選手交流会の会場(ホテルの宴会場)に行きました。大エンカ大会が始まります。

とはいってもチキンなので選手交流会ではこの2つしかエンカ写真はありません。直接名刺を渡しに来てくださる方もいて、その方言語学に興味があるとのことで「私韓国語少しやっています」という話をしたら「韓国語といえば、例えば茶碗蒸しが계란 찜になりますが、これ계란がそのままだしあぁ~~ってなりますよね」みたいな話を振ってくださり、非常に楽しかったです。私からは韓国語の法律は日本人にとっては読みやすいらしいとか、数学を韓国語でやると日本語との対応がかなり多くて楽しいという話をしました。

シンプルにおいしいもの多すぎませんか?会津大学は神。

もうひとつの選手交流会

まさか競プロerが選手交流会だけで満足するわけがありません。交流会が終了した後もホテルの廊下でエンカしまくったり、二回の休憩スペースで大量の人々とエンカしました。名刺もいくつか貰いました。

どんどん人々が来るので楽しかったです。私はあまり話しませんでしたが、そこにいるだけでも非常に楽しかったです。そもそも普段生身の人間から出るはずのない競プロ用語が他人の口から出てくるだけでちょっとテンションが上がるんですね。

ここでは「後で日経コン出ますか?」「日経コン出るので、それじゃおやすみなさい」という会話があったので、私も半年ぶりにratedコンテストに出ることにしました。その結果1完という悲惨な結果となりました。競プロは継続して取り組まないと頭が全く働かなくなってしまうので皆さんはこれからも継続してコンテストに出ましょう。

あとは風呂に入り、ベッドに向かいました。こうして一日目が終わったのでした。


二日目

二日目はモバイル部門の競技で、制作したアプリを他の人にポスターセッションや口頭発表するような人たちがいました。多彩な発想を様々な開発物から感じられました。他の人が自分の作ったものについて語っているのを聞くのは楽しいものがあります。

モバイル部門の口頭発表の後、いちまいの絵CG部門参加者の絵を鑑賞しました。どの絵も個性と技術があって見ていて楽しかったです。

館内でパソコン甲子園のグッズが売られているコーナーがあったのでそこに寄っていくと、接客をしているお兄さんがボールペンをとにかく私に勧めてきました。せっかく本選に来られたので持って帰ろう、あとファイルも買おうと手を伸ばせば「お兄ちゃんお目が高いねぇ〜!」とお兄さんの声が飛んできました。このあと赤べこのストラップもどうかと薦められたが、不必要だと思ったので断りました。

↑歩いているとあたたかいスープをもらうことができました。

この後プログラミング部門の本選問題の解説講義があったので聞きましたが、実際のところ名前は知っているが本質を全く知らないデータ構造などがあって、後半のほうは解説の解説がほしいなという気持ちになりました。あんな問題を解くことができた高校生、同じ人間だとは思いづらいです。もしかして人間の形をした別のなにかなのでは、と思ってしまいました。

この後は表彰式までかなり暇だったので、食堂でこの参加記を書くことにしました。
そういえば会津大学のブックセンターに行ったら技術書や数学書等がかなり占めていました。Cooking for Geeks 第2版があって立ち読みしました。

表彰式

実は表彰式が開始してからすぐに会場を退出してしまったので、詳しいことはわからなかった。

会|津|大|学を激写しながら大学を出て、駅に向かいました。
表彰式に最後まで残れなくて心残りではありますが、最後勝ち抜かれた選手の方の様子はTwitter上で配信されていたため移動中に見ることができました。


感想

飯が基本的においしいものしか出てこなくて天国だった。(ほんまにこれはそう)

私の人生初のオンサイトは今回のパソコン甲子園本選となりました。
自分には手の届かないような問題を通していく人々、本当に人間なのだろうか?と思いがちですが、強い人は本当に人であり努力量や熱意が並外れているのだとわかりました。
また、実際に会場で問題を解くというのは相当なプレッシャーと緊張が付きまとうのだということもわかりました。これは受験にも共通していると思いますが、人間、緊張するとできることが減っていくので、良い意味でも悪い意味でも自分の実力がそのまま表れてしまいます。私はどうしても大事なときに緊張してしまいがちな人間なので、†普段の行い†をよくすることでカバーしていけるような人間になるべきなんだなと思いました。

競プロerとの交流は、端的に言うと教養ある人たちが面白い会話を繰り広げていて、分別がある人たちばかりだったこともあり非常に楽しかったです。問題解説の講義のときも笑い所ではしっかり笑い、静かにするときは沈黙を守るといった競プロerの態度はとても良かった。大学でも頑張ってICPCとか参加したいし、他のイベントにも積極的に顔を出したいと思いました。
今回は以前の競プロキャンプや東工大OCでエンカした人々と再び顔を合わせる機会がありました。「久しぶりに会いましたね〜!」という会話ができて楽しかった。普段会うことのないネット仲間たちに出会えるのは一番交流していて嬉しいところだし結果として様々なモチベーションにもつながるので、今後も積極的に参加できるように頑張っていきたいと思います。

あとは名刺作っておけばよかったかな。

とりあえず、この辺で記事を終えることにします。参加者の皆さんお疲れ様でした。交流を心から楽しむことができました。またいつか会える日が来ることを楽しみにしています。