セキュリティ・キャンプ2026全国大会(デバッグツール自作ゼミ)参加記

はじめに

セキュリティ・キャンプ2026全国大会Y2ゼミに参加しました、まーたと申します。現在慶應義塾大学理工学部情報工学科の4年生です。忘れないうちにキャンプの参加記を残しておきます。

2025年

実は私は昨年の2025年もセキュリティ・キャンプ(主にCコンパイラゼミ)に応募していましたが、残念ながらその時は不合格でした。今思い返せば応募課題で頓珍漢なことばかり書いていたので当然の結果だったと思えます。

それでもやはり悔しくて、その後も独学で Rui Ueyama 氏の本(https://www.sigbus.info/compilerbook)をやったり、C言語のマイナーな仕様についていろいろ調べたりしていました。思えばキャンプ自体は不合格でしたが応募課題を行う中で実践した、「きちんとした資料(ISOの技術書など)から厳密な仕様を調べること」や「なんでも手元で実験してみて、資料と違う結果になったらその理由をさらに調べてみること」といった経験は、2026年の応募課題の回答やキャンプ本番を含め非常にためになったと感じています。

応募期間

B4となりシステムソフトウェア系の研究室に配属されました。

当初は去年のCコンパイラゼミにリベンジしようと考えていましたが、4月ごろに公開されたゼミのリストを見て今年はCコンパイラゼミが開講されないことを知りました。そのため第一志望としてレイヤが近い Y2「デバッグツール自作ゼミ」、第二志望として L2「プロセッサゼミ」を選びました。正直なところこの2つ以外興味のあるゼミがあまりなく、応募課題を3つも取り組む余裕もなかったので、第三志望は最初から設定しませんでした。

応募課題への回答は 5/5-5/18 あたりにわたってちまちま書き上げていきました。回答自体は以下の記事で公開しています。

zenn.dev

なお、第二志望のプロセッサゼミの応募課題についても途中までは書いていましたが、はじめから余裕がなく後半はすべて空欄、前半の内容も非常に薄いという具合でした。執筆にかけた労力でいえば Y2:L2 = 10:1 ほどです。それでもこのように労力に差を設けたのは意図的なもので、中途半端な応募課題を2つ提出するよりは1つに集中したほうがよいだろうという考えがありました。私の考えですが、開発コースで第二志望以下に配属される可能性というのはあまりないように思われるので、今後キャンプを目指す方は単願も視野に入れると良いかもしれません。

応募課題の回答内容自体については、これも個人的な感覚ですが「実際に実験してみてその結果について考察する」というのが特に有効な気がします。いろいろ論じるネタが生えますし、今の時代 LLM に丸投げしていないというアピールにもなります。例えば私の場合は CVE を1つ取り上げるという設問に対して ImageMagick のフォーマット文字列の悪用(CVE-2025-55298)を取り上げましたが、ImageMagick を clone して当該バージョンでビルドし、報告書に記載されていた PoC を実際に試してみるということを行いました。

合格発表-キャンプ直前

応募課題締切後は去年辛酸を嘗めた経験もあり、「どうせ見込みはあまりない」と言い聞かせて期待しないようにしている自分がいました。それでも合格発表が予定されてた5月末にはかなりそわそわして、毎日 IPA のサイトを見に行ったりしていました。そうしたら合格発表が6月頭に延期されるという発表があり、さらに焦れったい思いを味わうことになりました。

6月3日、ようやく選考発表があり、合格していました。インターネットや現実世界の「つよつよ」な学生たちの輪に入れ、さらに自分自身も成長できるということに大いに喜びを感じました。ほどなくして Discord に招待されましたが、他の受講生の自己紹介を読んだだけで周囲のハイレベルさに若干怖気付いていました。

Y2ゼミでは週に1回、約30-45分ほど事前学習の時間が設けられており、キャンプ前からある程度開発を進めておくというスタイルでした。そのため6月頭から7月末までは個人で作業しながら週1の事前学習 MTG で進捗共有・次の作業を決めるという流れでした。

ところが私はその期間ちょうど論文の輪講準備(私の学科ではB4春学期に教授数人の前で読んできた論文を発表する「輪講発表」が必修単位として定められています。)で忙しくしていました。さらに、AddressSanitizer を自作すると決めたのはいいものの、私が独自性のあるアイディアをほとんど思いつけず、ほぼ講師の考えに従っているだけとなっていました。その劣等感もあり、正直なところ7月ごろにはキャンプへのモチベーションは低下気味でした。

キャンプ参加までには、次のような作品ができていました。

単純な C のヘッダライブラリとして、void *asan_malloc(size_t size); と void asan_free(void *p); を作成しました。これは GWP-ASan(https://llvm.org/docs/GwpAsan.html)の要領で、asan_malloc では mmap システムコールによりメモリページを ceil(size / PAGE_SIZE) + 2 枚確保し、以下の図のように mprotect システムコールで両端をアクセス禁止にします。

GWP-ASan 風の `malloc`

そして asan_free では実際には free せず中央のアクセス許可ページを mprotect によりアクセス禁止にします。この上で SIGSEGV をシグナルハンドラによりハンドルすることで

  • 右端のページを踏んだ場合: 過大なほうの heap-buffer-overflow
  • 左端のページを踏んだ場合: 過小なほうの heap-buffer-overflow
  • 中央のページを踏んだ場合: use-after-free

と判別します。(詳しくは下の公開リポジトリの過去コミットをご覧ください。)

github.com

尤もここまででの実装量はわずか130 loc 程度で、その動作も現実の ASan や GWP-ASan の下位互換にすぎず、後れをとっている自覚がありました。ちなみに、今回の開発で Codex 等コーディングエージェントを使うかはかなり迷いましたが、Yゼミのテーマが「○○自作」である以上成果物自体を早く楽に作り上げるよりも開発で試行錯誤する過程で学びを得たいと考え、結果的には後述の fancy な表示の実装とどうしてもバグが取れない場合のデバッグ以外では基本的に使いませんでした。

セキュリティ・キャンプ本番が近づくとノベルティが届いたり、キャンプ当日の案内が送られてきたりしました。ノベルティについては箱いっぱいに詰まっていて驚きました。

セキュリティ・キャンプ協議会から届いたノベルティ

一方で当日の案内については 8:30 から 21:00 まで予定がぎっしり詰まっていることや、自由にコンビニすら行けないことを知り、不安と若干の不満を抱いていました。

1日目

そんな中キャンプ本番を迎えました。横浜線で橋本まで行ったあと京王相模原線に乗り換え京王多摩センターまで向かうという経路でした。ジャンクフードもしばらくお預けかと思い昼食はマクドナルドにしました。

多摩センター駅から会場の LINK FOREST まではペデストリアンデッキを使えば簡単に行けますが、ルートを調べなかった結果地上の歩道を歩いてしまい少し迷ってしまいました。

LINK FOREST 外観

会場入口

会場に入ると開講式会場に通され、そこでは早速受講生同士が名刺交換などして交流していました。同じ班になった受講生が早速話しかけてくれて、私も名刺を交換したり雑談したりしていました。不安の中早速打ち解けることができたのは非常にありがたかったです。

その後開講式が行われ、関係者のスピーチ等を聞きました。開講式後はそのまま共通講義 K1, K2 を受講しました。特に K1 の話がまるで小説のようで興味深く、夢中で聞いていました。

時間はすぐに過ぎチェックインの時間になりました。部屋は一人部屋で広く清潔で、とても満足でした。

宿泊部屋

夕食も期待以上の美味しさで、生活面での心配は杞憂となりました。夕食後はしばらく休憩時間だったので部屋にいましたが、想像以上に疲れていたのかベッドから動けませんでした。

1日目の夕食

その後交流会企画があり、10人ほどの受講生・チューターと名刺交換をしました。疲れが想像以上にきており、そこまで十分に話せなかったのが心残りです。

交流会企画終了後は入浴してなるべく 23:00 ごろには寝ました。夜食として持ち込んだカップ麺を食べようとしたら箸を忘れたことに気づき断念していました。

2日目

6:30 ごろ起床。朝食で同席になった人とは初対面でしたがいろいろ話せました。この時に限りませんが、受講生同士は初対面であることが大半なので逆に話しかけやすく、終始よい雰囲気だと感じました。

7:45 に案内通りコンビニに寄りました。昨日書い忘れた割り箸とともに、施設内がかなり乾燥していたのでオールインワンのスキンケアクリームを買いました。

8:30 に作業部屋に向かい作業を開始しました。講師の mikit さんと同じゼミのもう一人の受講生とはそこで初めて顔を合わせました。

午前中は主にヘッダライブラリから DSO への切り出しと、コンパイラ側で識別子を置換することにより malloc / free でそれぞれ asan_malloc / asan_free を呼び出すようにする変更を行いました。なおそのまま malloc / free という識別子を定義すると、printf 等が内部で malloc を呼ぶことにより無限再帰に陥るためこのような実装に落ち着きました。おそらくリンカをうまく設定することでもっと行儀良く解決可能だとも思えます。この時点で unmodified なソースコードに自作 ASan を適用するところまで成功しました。

GWP-ASan 方式のときのホワイトボード

昼食後は毎回の dereference をトレースして SIGSEGV 時にアクセスのログを出力するところまで実装しました。この時点でメタデータの管理に OpenBSD の平衡二分木を使っていましたが(アドレス p から prev(tree.upper_bound(p)) の要領でバッファに対応するメタデータの「唯一の候補」が取得できます。)、実はその時点でページ単位で管理する必要はなくなり、単に asan_malloc の中で通常の malloc によりバッファを大きめに取り両端を redzone として、各アクセスの際にメタデータに記録されている先頭アドレスやサイズの情報から有効なアクセスかどうかを調べるのみで ASan の機能を実現できることを教えていただきました。それに基づき実装を見直したところ、生のシステムコールの操作やシグナルハンドラすらいらなくなり、良く言えばロジックがシンプルに、裏返すと以前よりしょぼい感じの見た目になってしまいました。

実装を変更後の `malloc` の模式図

午後にはY2ゼミの3人で Network Operations Center (NOC) の見学にも行きました。このような機材が学生であるチューターの方々によって運営されていることに対して敬服の念がわきました。そう思っていたら間瀬bbさんが電話やファクシミリでお遊びを始めて笑ってしまいました。

NOC の機材

そうこうしているうちに夕食 + LT会まで休憩。ほんの少し休んだつもりでもすぐ時間になってしまいました。LT会は特に Ryoga_exe さんのドイツの電話機の話が技術的にもユーモア的にも面白かったです。私は発表しませんでしたが、今思えばC言語の非自明な仕様などの話を発表してもよかったと思っています。

LT会後は部屋に戻って寝るだけのはずがインキーしてしまったり講義室に鞄を忘れてしまうなど随所で疲れが現れていました。

せっかくだからと思い、朝買った割り箸で夜食のカップ麺を食べました。

3日目

6:45 ごろに起床。朝食では同じように偶然同席した受講生と雑談していました。

午前中の開発では昨日に引き続き GWP-ASan 方式 → ASan 方式への実装の切り替えに加え、今までは free を呼んでも実際にはメモリ解放せず意図的にメモリリークさせていたのを、free 後のバッファを queue(リングバッファ)に入れ一定期間 quarantine するように変更したりしていました。また mikit さん含めた3人で Z, L ゼミの見学に行ったりしていました。

午後は現実世界の CVE として libpng の CVE-2026-33416 を試していたら、試行錯誤の末確かに巧妙な入力で use-after-free が起きることを再現できました。以下の画像はその時の様子ですが、libpng に付属していたサンプルなど通常の画像では正常に終了するのに対し、細工された画像(poc.png)では use-after-free と出力され異常終了しています。

CVE-2026-33416 の検証に成功した様子

現実世界の脆弱性を検証できたときは大きな達成感を得ました。そして、これはキャンプ開始前は想像していなかった成果でした。

その後応募課題で ImageMagick を取り上げたこともあり、同様に clone してビルドしようとしたところ、オリジナルの chibicc が int f(int), g(int); のような記法の関数宣言に対応しておらずビルドできませんでした。これは chibicc の open issue となっているようです。私も mikit さんもこの文法は初めて知るものでした。

開発の休憩時間に今度は X1 と X3 の見学に行きました。Xゼミは物理的な事象を相手にしなければいけないのでYとはまた違った難しさがあると感じました。

また午後に専門 C3 の講師の方が見学に来られてかなり長く話していましたが、C3 のテーマがまさしく heap に対する攻撃であるらしく、その講師にお墨付きをもらえたようでした。

気付かぬ間に mikit さんと hikalium さんが NOC に「コーヒーの注文パケット」を数万件送り、実際に NOC からコーヒーが来るという出来事があり非常に楽しかったです。画像左では Brainux を祀る神社も建立されつつありました。

NOC から届いたコーヒー

夕食後はこの日は部屋に戻らず講義室に戻って実行時間ベンチマークを書いていました。 500 \times 500 の行列積を書いたところ、以下のようにオリジナルの 83 倍実行時間が増加するという結果になりましたが、ポインタの dereference ごとに  O(\log n) 時間( n: malloc を呼んだ回数)かけてメタデータを検索しているのでオーバーヘッドの大きさは予想通りでした。

  • chibicc-ASan(自作): 87762 ms
  • オリジナル chibicc: 1052 ms
  • (参考)gcc -O0: 305 ms

共通講義 K3 がありましたが、申し訳ないのですが疲れもありあまり内容は入ってきませんでした。

4日目

4日目ともなると疲れも相当蓄積してきて、7:15まで起きられませんでした。この日は午後からYトラック内の発表があるため実質午前中しか使えません。最初は global 領域や stack 領域にも対応させようとしましたが、手で書くには残り時間が中途半端かつ本質的な機能をバイブコーディングで実装するのも気が乗らなかったため、結局以下の図のように、出力に模式図を含めるところを Codex に実装させる程度にとどめました。会員企業の見学者の方も複数来ていたので、いろいろと説明しているうちに時間が過ぎました。

自作 ASan の出力を改善した様子

最終的なホワイトボード

午後はスライドを作り、Yトラック内で発表しました。自分の発表は問題なく終えられましたし、他の受講生もみなさん特色ある作品を作っていて、楽しみながら発表を聞いていました。

片付けと夕食後は CTF 大会がありましたが、疲労が最高潮に達して虚ろな頭で参加していました。それでも一時期 Daily AlpacaHack に取り組んでいたこともあり、5分問題のほとんどと10分問題の半分ほどは解くことができました。

5日目

7:30 ごろ起床。朝食後は成果発表会と閉講式がありました。成果発表会では1分だけ発表しましたが、然程緊張することもなくきちんと要点を伝えられたと思います。他の人の発表も聞きましたが、専門コースや他の見学できなかったゼミがどのようなことをしたのか非常に参考になりました。閉講式後、無事に修了証書を授与されました。

昼食は班の4人で食べました。皆の学生生活などの話などで盛り上がり、思い出に残る昼食でした。

昼食後は企業との交流会の時間で、事前に希望と抽選で選ばれた4社を廻った上で自由時間に好きな企業を訪れるという時間でした。事前に選ばれた4社のうち1社は大学の研究内容にもセキュリティ・キャンプのゼミ内容にも近く非常に興味深い会社でした。逆に、残りの3社は話がサイバーセキュリティに寄っており、正直なところ私の分野と食い違っているという印象でした。

例の如く5日分の疲れが蓄積していたことと、企業の方と話すのは若干気疲れしてしまうこともあり、自由時間は3-4社程度廻っただけでした。これについてはもう少し頑張っておけばよかったと悔やんでいます。

夕食の立食パーティーでは OS 自作ゼミの masui さんとたくさん話していました。私の研究室がシステムソフトウェアであることもあり、OS の踏み込んだ話から進路まで充実したお話ができました。

食事の後は私の持参したボードゲームで遊んでいました。主にニムトをプレーしましたが、最初3人だったのが徐々に人が増えていき、最終的に9人にまで増えたりもしました。初対面の人ともすぐ仲良くなれたので、ボードゲームを持参したのは本当に正解でした。(来年以降キャンプに参加される方もぜひ!)

キャンプを乗り切った開放感から部屋で結構夜更かしをして、1:00 くらいに就寝しました。

6日目

7:30 ほどに起床。この日は朝食だけ摂ったら解散の日でした。朝食会場で同じ班の受講生と出会い2人で食事をしました。8:15ぐらいにチェックアウトしたら受講生が誰もロビーにおらず、なんとなく外に出てしまいましたが、その後同じ班の受講生がロビーに集まっていると聞き戻ったりしていました。

同じ班の4人 + 新たに出会った人でボドゲカフェに行ってボードゲームで遊んだ後解散しました。

おわりに

記事を読んでいただいたらわかるとおり、セキュリティ・キャンプの本番前は正直なところあまり前向きな気分ではありませんでした。しかし、共通講義の班の受講生、同じゼミの受講生、講師の方をはじめとする参加者と出会い、いろいろな刺激を受け、いろいろな知見を得ることで、最終的には自作 AddressSanitizer で現実世界の脆弱性の検証に成功するという、予想を超える成果を収めることができました。さらに、技術から趣味の話までできて一緒に遊びに行くほどの友達ができたことも他では代え難い機会となりました。

今後もネクストやチューター等の形でぜひセキュリティ・キャンプに関わっていきたいと思っています。またこの記事を読んでいる方も応募資格さえあればぜひセキュリティ・キャンプに挑戦していただければと思います。

Vanilla JS で Web アプリを作ってみた

はじめに

beatmania IIDX の打鍵数を GitHub の草風に表示するツールを作ったのでそれについて簡単に記します。

成果物

https://ma-tw.github.io/iidx-grass/

github.com

実装

Web サイトの仕組みを理解すべく、あえて何のフレームワークも利用せずに HTML, CSS, JS を直接編集して実装しました。このように制作した背景としては、以前制作した緑数字計算機 (https://iidx-green.vercel.app/) で Next.js を用いたところ、作品は完成したもののフレームワークが高級すぎて Web の仕組みの理解からはかけ離れていたことが挙げられます。

GitHub 風のヒートマップについては Cal-Heatmap (https://cal-heatmap.com/)、CSV の解析は Papa Parse (https://www.papaparse.com/) を使用しました。

処理はすべてフロントエンドで行う静的サイトとなりました。

感想

かねてよりインターンでの React や先に述べた Next.js の使用などでフロントエンドを実装した経験はありましたが、特にクライアント側 JavaScript について生のものを書いたのは初めてでした。その上で、JavaScript の動的型付けは単にバグを生みやすいだけでなく、エディタの補完も効きづらいことから大きなプロジェクトでは開発が困難になること、そしてその問題を解決する TypeScript の便利さを実感しました。

要素の中央揃えに意外と手こずりました。text-align: center;, margin: auto, flex の justify-content: center; の使い分けが難しいです。それでも試行錯誤の後に flex の気持ちが若干わかった気がしました。

これからも個人開発に励んでいきます。

ICPC Asia Yokohama Regional Contest 2023 参加記

図1. ICPC 会場の様子

はじめに

2023/11/25 - 11/26 に開催された ICPC アジア地区横浜大会にチーム masamune として参加したので、記憶が飛ばないうちに記します。

自己紹介

まーたというハンドルネームです。各種サイトには ma_tw というユーザ名を使っています。一応アルファベットだと Marta なのかなと思っています。

編集時点で競プロは水色。早く青になりたいと思いつつ、精進ができていません。

masamune について

チームメイトのお二方は momoyuu さんと だれ さん。編集時点でどちらも AtCoder 黄色なので、黄黄水とかなり実力に差があるチームとなっています。実のところいろいろとありがたいことがあり私はこのチームのメンバーとなれています。2 人に追いつけるよう頑張ります。

Day 1

正午ごろ、日本大通り駅に到着。チームで昼食を摂ろうという話をしていたのですが、日本大通り周辺地帯にあるのは高級レストランばかりで入りやすい店が少ないことが判明。最終的に無事ファミレスに入れました。

13:15 頃には既に会場に到着。噂には聞いていたものの、実際に受付から全て英語だったのであまり慣れない感覚でした。実はその日はコーチが欠席で、それを伝える仕事を任されてしまったのですが、シンプルに "Our coach is absent today because he's sick." とかで乗り切りました。

あの時点で知り合いがいないか見回していたのですが、どうにもピンと来る人が居ず断念。そんな感じで割とぼうっと過ごしていたら早速開会式の時間に。システムの説明での Clar の内容が印象に残っています。

リハーサル

事前にエディタをどうするか話していたのですが、結局 VSCodium を使うことに。私は B 以降の読解やインタラクティブツールの使用のほか、US 配列へ慣れるために D の実装も担当しました。D は選び方が  n!! になることがミソですね。ところで US 配列には大苦戦していました。特に括弧の位置がキー 1 つ分だけずれていたりするのが厳しいです。

リハーサル後

リハーサル後はチーム紹介の時間に。ここでも私がスピーカーとして抜擢されてしまいました。喋ることそのものはそれなりにうまくできましたが、原稿に目が向きがちだったのが反省ポイントです。

図2. チーム紹介スライド

夕食は masamune + nok0 さんの 4 人で中華街へ。どこも混雑の中入れたお店 (名前を忘れた) では、食べ放題でないメニューを受け取るために店員さんを呼ぶまでに 10 分かかるなどいろいろありました。なお料理はとても美味しかったです。写真は撮っていませんでした。

その後 nok0 さんに誘われ 2 人でゲーセンへ。チュウニズムが 1 台しか無かったため順番に 1 クレジットずつプレイしました。私のリクエスト (無茶振り?) で nok0 さんに盟月と Chaotic Ørder をプレイしてもらいました。私も早く虹レになりたいです。

そんなこんなで宿泊先へ。

Day 2

図3. 朝の起床確認

全員無事起床したのを確認して、安心して会場へ。ここでコーチとも合流しました。ところがここで問題が発生します。既に駅には到着したはずのチームメイトの 2 人がいつまで経っても会場へ来ません。

図4. 迷子

なんと逆方面に向かってしまい迷ったとのこと。結局入場が開始して随分経ってから 2 人が到着。焦りました。

コンテスト

説明も終わりコンテストの時間に。だれさんが A を解いている間に私は B 以降の読解をして紙に問題を要約していきます。


B

プレイヤーのランクを一定の規則に従って上げる。与えられた条件がややわかりにくい。

C

観覧車のゴンドラを塗り分け、同じ色のペアを線分で結んだとき線分が交わらない場合の数。読んでいた時は最難であることも知らず淡々と読解。

E

a - b - c という並びの条件が複数与えられたときの順列の数え上げ。

G

カードが並んでいて、サイコロを振る度に左から出た目と  \mathrm{mod} \ 6 で合同なものを消していく。最後に  i 枚目が残る確率。

K

インタラクティブ。正方形の中の円があるので、こちらが指定した線分との共通長さを尋ねることにより半径と中心座標を求める。


途中 momoyuu さんが H を解くのに Dinic 法ライブラリを写経したりもしました。ここでもやはり US 配列に悩まされていました。練習しなければ。ちなみに H が落ちたとき私にかなりの疑いの目が向けられました。こわいですね。(ライブラリにも写経にも間違いはありませんでした。)

K は私がそれなりに考察に寄与しました。1 つの座標について、2 つの長さがわかればそこから初等幾何の力で座標と半径を求められるのではないかと頑張っていました。(実際に方程式を解いていたのはだれさんです。)

そのほかに、開始直後の環境構築をしたり、例のごとくインタラクティブ問題のテストを担当したりしていました。

その他の問題の感想についてはチームメイトお二人の参加記をご覧ください。(書くのかな?)

昼食ではお弁当が配られました。片手で食べやすいよう考慮されていると聞いていましたが、実際おにぎりとサンドイッチがメインでした。特におにぎりは味付けが絶妙で美味でした。他にもラムネやチョコをつまんでいました。

コンテスト中の机にはメンダコと、 masamune の守護神として福翁自伝を置いていました。メンダコは momoyuu さんの思考のお供になれていたようです。

コンテスト後

5 時間のコンテストもあっという間、コンテスト終了です。私としては頑張って考察していた K を通したかったです。いろいろ思いはありますが、まずはお疲れさまの時間です。途中でリアルの旧友と会ったりしたほか、会場の中をぶらぶらと歩いたりしていました。このタイミングで JAG 夏合宿で同室だった log K さんと会い、感想を話したりもしました。

作問陣の方々には申し訳ないですが、解説はあまり聞く余裕がありませんでした。

さて、解説やスポンサーのスピーチが終わり YesNo の時間に。masamune も 1 つ Yes を貰いましたが、最終的な順位は 29 位でした。また来年挑戦したいです。それはそうと Yes を貰えると会場に拍手が沸くので嬉しいですね。

図5. 順位表

優勝はノーペナ全完の Speed Star。異次元という言葉がふさわしいです。

懇親会

表彰等の後は隣の会場で立食懇親会。会場ではさきの log K さんのほか、JAG でチームを組んだ おここ さんとたくさんお話をしました。他にも rin204 さんや、chokudai さん、けんちょんさんなど有名な方と交流でき、とても楽しく貴重な経験となりました。これは個人的なことですが、私は元々会話があまり得意でなかったのにもかかわらず、他の方のおかげでたくさんコミュニケーションができたのも嬉しかったです。

そして以前会ったことのある方々が皆さん私のことを覚えていてくれたので、ありがたく思っていました。

ちなみにコンテスト中にいろいろなものをつまんでいたため、料理はあまり食べられませんでした。少しもったいない思いです。

その後 momoyuu さん、 SPD さんと会話しながら駅に向かい帰路につきました。

おわりに

今回が私の初めての ICPC の参加でしたが、このようにアジア大会に出場できたことはとても嬉しいです。来年はぜひもっと強くなって、もっとチームに貢献する形で再挑戦したいです。また来年は慶應大学からもっと多くのチームがアジア大会に進出できることを期待しています。

最後になりますが、チームメイトとコーチのお三方、主催者とスタッフの方々、選手の皆さん、その他 ICPC に関わってくださった全ての方々に感謝いたします。

拙い文章でしたが、お読みいただきありがとうございました。

AtCoder で水色になりました

はじめに

こんにちは。高校 3 年生の ma_tw と申します。この度、AtCoder で水色のレーティングに到達したため、その記録としてこの記事を書きました。(いわゆる色変記事です。)

筆者について

以前よりプログラミングに興味があり、高校 2 年生のとき少し Python を勉強していました。しかし特に作るものもなく、適当なコードを書いているだけでした。(ゲーム開発等にはあまり関心がありませんでした。)

そんなとき、競プロの存在を知ります。恐らくは Twitter で見かけたのだと思います。それで何となく AtCoder Beginner's Selection を解いてみたところ競プロに興味を持ちはじめ、コンテストに出始めるようになりました。またそのとき競プロには C++ が向いているということを知り、C++ を勉強しはじめました。そして今に至ります。

記録

初めてコンテストに参加したのが 2021/9/4 なので、およそ 1 年と 2 ヶ月での入水となります。

履修したアルゴリズム等

あくまでなんとなくです。(以下に並べたものの中でもまだまだなものもあります。)

  • 二分探索
  • DP
    • ナップサック DP
    • 区間 DP
    • bitDP
  • 累積和
  • いもす法
  • 座標圧縮
  • 繰り返し二乗法
  • 素数あれこれ
  • 基本的なゲーム問題
  • セグメント木 (ACL のみ)
  • UnionFind (ACL のみ)
  • DFS
  • BFS
    • 01BFS
  • ダイクストラ法
  • ワーシャルフロイド法
  • クラスカル法

心がけたこと

「たくさん問題を解く!」等は既に何度も言われているので、私なりに役に立ったと思うことを書きます。なお、これらはあくまで私個人の考えですので、参考程度に読んでください。

精進の際は教育的問題を解く

ABC 埋め等も大事だと思いますが、AOJ の Course*1 や、こちらの記事にまとまっている問題集など、いわゆる有名問題や練習問題として選ばれた問題などを積極的に解きました。これにより典型力は効率的についたと思います。

早さよりペナを出さないことを優先する

コンテスト中、早さを意識するあまり深く考えずに提出をした結果 WA が出てしまい、さらに焦ってボロボロになってしまうという経験が何度もありました。無闇に書いて投げるのではなく落ち着いて、ミスに気をつけながら解くほうがコンテストの結果は良かったです。

コンテスト中は精一杯解く

私は例えば ABC において、D が解けたあと気が緩んでしまい、「もういいか。E は無理かな」みたいな思考になりがちでした。ABC-D が碌に解けなかったころの感覚が残っているのだと思います。しかし実は E も考えればわかる問題であった、などということも多く、このような思考に陥るのは勿体ないです。E や F も解く気でしっかりと考察することで、5 完や 6 完を達成することも多くなりました。

これからの目標

とりあえず誕生日 (2023 年 6 月) までに AtCoder 青色を目標にします。そのために、

  • UnionFind を自分で実装
  • セグメント木 (遅延評価も) を自分で実装
  • フロー
  • よりレベルの高いゲーム問題 (Grundy 数等)
  • struct 関連に強くなる
  • 幾何

あたりを履修していこうと思います。(特にセグメント木実装とフローは頑張ります。) また、入水したらやろうと思っていたヒューリスティックにも挑戦していきます。

おわりに

正直、まだ入水した感覚が掴めていないです。競プロを始めた当初は遥か遠く思えた Rating 1200 という場所に到達できたということを考えると、なんだか感慨深いです。そもそも、自分がここまで競プロを続けられということが予想外でした。何はともあれ、さらなる高みを目指して、今後も取り組んでまいります。

稚拙な文章でしたが、最後まで読んでくださりありがとうございました。

*1:すみません、今見返したところ AOJ はあまり埋めていませんでした。

E8 さんの記事のメモ

レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】 - Qiita

TODO

二分探索

21 わからない

23 半分全列挙、P に 0 を入れると楽

DFS

24

25

27 WA

BFS

28

30

31

32

DP

40

41

42 解けなかった

43

44

45