AHCに初めて参加する人が読む記事2025

AtCoder Heuristic Contest（AHC）を始めてみようと思った人が、最初にコンテスト参加する際に参照するとよさそうなことがらをまとめてみました。

普段AHCに参加している人にとっては慣れた話だが、初参加のときには戸惑いがちなところをカバーする内容になっていればと思います。

2025年1月時点での情報です。


## 参加登録

アルゴコンテストと同じようにボタンを押して参加登録しましょう。

AHCでは **Rated参加・Unrated参加の区別はありません** 。回答を提出した時点でRated参加になります。
また、コンテスト開始後でも、 **コンテスト終了までの間は参加登録できます** 。

AHCでは、 [コンテストに参加することがレーティングに対してマイナスにはならないような計算方法](https://info.atcoder.jp/overview/contest/rating#Heurisitc%E7%B3%BB%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF) が採用されているため、良くない成績を取ってレーティングが下がる心配はせずに参加できます。


## 問題文

ヒューリスティックの問題は、アルゴ部門の問題文に比べれば長いことが多いですが、コンテスト時間も長いのでじっくり読みましょう。

問題内容を勘違いしたままたくさん実装してしまうと致命的なので、下記のローカルテスターやビジュアライザを使って、理解が正しいことを確認しつつ実装を進めると良いです。

アルゴと大きく違うのは、「入力生成方法」のセクションがあることです。

アルゴリズムコンテストでは、コーナーケースをカバーするように人手も交えて作られたような入力が与えられますが、ヒューリスティックコンテストではテストケース生成方法のアルゴリズムが示され、これに従って生成されたデータが入力となります。


![AHC039 入力生成方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/989fa891-d716-969b-0aba-b993e7a7d38a.png)
（[AHC039の問題文](https://atcoder.jp/contests/ahc039/tasks/ahc039_a) より）


極端なコーナーケース（この例だと、全部の点が隣接した位置に集まっていたり、逆に全部の点が領域全体に等間隔で配置されていたり）は確率的にはまず含まれないと考えて良く、生成方法で示されるような入力データの分布に対して平均的に良い結果を出す回答を作ることになります。


もうひとつヒューリスティックに特徴的な点として、入力の値が固定値であることがしばしばあります。

![AHC035 入力制約](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/2fdcf2be-85a2-f163-0b09-94271b6f94d0.png)
（[AHC035の問題文](https://atcoder.jp/contests/ahc035/tasks/ahc035_a) より）

これはこういうものなので、気にせずやりましょう。


## ローカル版テスター

コードを提出すれば何らか結果は出ますが、結果のフィードバックが提出のみだと、デバッグが大変辛いです。
ヒューリスティックでは、バグっていてもACになってそれなりの得点が出てしまうことが多く、バグっていてもそれに気づけないという場合もあります。

問題文中で提供されているツールを使うと、自分が出した答えの得点を計算してくれます。ぜひ使いましょう。

![テスター](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/f0f09641-ac5f-e730-8cd8-16574e99a8ec.png)

::: note
Web版のビジュアライザでも得点は計算してくれ、最初はそれでも大丈夫なのですが、毎回実行のたびにコピペする必要があって面倒です。できればRustのローカル版テスターは使えるようになっておくことをおすすめします。
:::

自分でスコアを計算できるタイプの問題の場合は、自分で回答の中で計算したスコアを標準エラー出力に出力しておき、ローカルテスターが出力するスコアと合致しているか確認すると良いです。

ローカルテスターを使う大前提として、 **回答を自分のパソコンのコンソール（いわゆる "黒い画面" ）で動かしている** ことがあります。
AtCoderのコードテストやpaiza.io, wandboxなどのオンライン実行環境でプログラムを実行している場合は使えません。

:::note info
私見ですが、そのようなオンライン実行環境はプログラミングの初学者が試しに動かしてみるという点では良いものではあるものの、ある程度継続的にプログラムを書く（競プロだけであっても！）となると自分のパソコンに言語処理系をインストールして手元でプログラムを動かせるようにしておくのがよいと思います。
AHCに参加しようというのであれば既に初学者の域は脱していると思うので…。
:::

ローカルテスターの使い方はzipの中に入っているREADMEファイルに書かれていますが、それなりに慣れている人向けの記述ではあって、この手の操作が初めての場合はすんなりわからないかもしれません。
わからないところがある場合、コンテストの内容には触れない形で、周囲にヘルプを求めるのはありです。
コンテスト中に問題内容や考察について他の人と共有することは禁止されていますが、ツール類の使い方については共有OKです。

![スクリーンショット 2025-01-04 17.34.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/2a20e293-0db8-4a7c-4225-f993aadee653.png)
（[AHC040トップページ](https://atcoder.jp/contests/ahc040) より）

::: note warn
ヘルプを求める場合、書き方によって助けを得られやすいかどうかが変わってくると思います。詰まっているところを具体的に書きましょう。

* 助けを得られにくい例：「環境構築わかりません」
* 得られやすい例：「READMEにあるこの文の意味がわかりません」「xxx のコマンドを実行したときにこういうエラーが出ます」

何がわからないかがはっきりしていた方が、助言する側もしやすいので。
:::

### インタラクティブ問題について

インタラクティブ形式の問題の場合、問題文の下の方に「ツールで用いられる入力ファイルの仕様」のようなセクションがあることがあります。 

![AHC040 ツールで用いられる入力ファイルの仕様](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/47081190-5e5a-db12-4618-d584cb8d181c.png)
（[AHC040の問題文](https://atcoder.jp/contests/ahc040/tasks/ahc040_a) より）

基本的に，この部分は無視して大丈夫です（自前でテスターを実装するといった凝ったことをしようとしない限り）。

入出力のセクションに書かれている内容通りに実装しさえすれば、ローカルテスターは適切に動いてくれ、自分の回答のスコアやログを確認できます。


## ビジュアライザ

Webビジュアライザでは回答がどういう様子がわかりやすく表示され、便利＆楽しいので使いましょう。


使い方に暗黙的な部分がありそうなので少し書いておきます。

### 1. 自分のプログラムで回答を出力する

ローカルテスターをダウンロードしてzipを展開すると、 `in` というフォルダに `0000.txt`, `0001.txt`, ... というファイルが入っています。

![テスターのファイル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/89a0f81a-8428-3683-4fc1-21d58e7874c0.png)

`0000.txt` は、乱数seedに `0` を指定して生成された入力ファイル、 `0001.txt` は、乱数seedに `1` を指定して生成された入力ファイル、… という命名になっています。

ここでは、 `0001.txt` を入力としてプログラムを実行してみましょう。

```
python3 main.py < tools/in/0001.txt > out_0001.txt
```

（Pythonの例。インタラクティブだったらまた違う形になります。ツールのREADMEを参照してください）

`out_0001.txt` に出力が生成されます。


### 2. ビジュアライザのseedをセットする

ビジュアライザの `Seed` 欄が、ビジュアライザで扱う入力を生成する乱数seedを指定する場所です。

![ビジュアライザ設定欄](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/f372d24c-e556-a5a7-d423-bbfe7ba22a92.png)

先ほど `0001.txt` を入力として出力を作ったので、ビジュアライザ上のSeedを `1` に設定しましょう。

すると、 Input 欄が `0001.txt` の内容と同じになるはずです。

### 3. ビジュアライザに回答を貼り付ける

Output欄に、1.で出力した `out_0001.txt` の内容を貼り付けます。

すると、回答の内容がビジュアライズされます（エラーがあったらエラーと表示されます）。

![ビジュアライズ結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/1a1ac9a1-f24d-a38f-9590-488273e64478.png)

画面上で色々操作してみましょう。

::: note info
ビジュアライザの上の方に使い方の説明が書かれています。

![AHC040ビジュアライザ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/65d0efca-966d-be17-7167-1df457eb7923.png)
（[AHC040ビジュアライザ](https://img.atcoder.jp/ahc040/RGoXy7re.html?lang=ja) より）

この部分、文字が多くて無視しちゃいがちなのですが、気付いていなかった便利機能について書かれていたりすることもあり、一度は目を通しておくと良いです。
:::


## 提出

回答を提出することのデメリットは基本的にはなく、何か回答ができたらとりあえず提出しちゃっても大丈夫です。 ヒューリスティックでは **ペナルティの概念はありません**（順位表上では現在の得点を取るまでに何回提出したかは表示されますが順位には関係しません）。

ただし、 **提出間隔に制限** があって頻繁に再提出はできないため、コンテスト終了間際には注意してください。おおむね、短期コンテストだと5分間、長期コンテストだと30分間、提出の間に間隔を空ける必要があります。

![AHC040 提出間隔制限](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/5f540a5b-fb35-da0a-116e-df69544f25e1.png)
（[AHC040トップページ](https://atcoder.jp/contests/ahc040) より。問題文の中ではなくコンテストトップページでの記載なので見落とされがち）


問題によって、絶対スコアが高い方が良い場合と低い方が良い場合があります。 
問題文の「得点」のセクションに記載されている内容を参照してください。

![AHC040 得点](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/75eebf4e-2171-d8c6-ed4e-63ea6f6aa1b0.png)
（[AHC040問題文](https://atcoder.jp/contests/ahc040/tasks/ahc040_a) より）

順位付けが相対スコア形式の場合、自分の提出一覧で表示される得点は絶対スコアです。 
![AHC040 提出結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11745/7d42cc45-8de6-ecbf-cc51-d314e116f0c9.png)
この画像はAHC040の提出結果です。この問題は絶対スコアが小さい方が良い問題なので、基本的には上の提出の方が良い結果です。

::: note warn
システムテスト形式の場合は、提出した結果の得点だけを見ていると暫定テストに過学習してしまう恐れがあります。
慣れてきたら、自分で別の多くのテストケースで評価して本当に強い回答はどれかを決める、といったこともやっていけると良いでしょう。
:::


## コンテスト中のSNS

コンテスト終了までは、問題や解答の内容、方針についての共有はNGです。
このあたりはABCとかと同じですが、コンテスト期間が長いためおざなりになりがちです。気をつけましょう。

コンテスト中には書かない方が良いと認識している発言の例：
* 「TLEが解消しない」
* 「重要な気づきを得てスコアが上がった」
* 「アイディアがあと3つあるので実装していきます」


## 練習

コンテスト本番で参加することが一番のトレーニングです！ 
直近では以下のコンテストがあります。参加しましょう。（ちなみに私は日本橋ハーフマラソン2025冬の運営です）
* 短期コンテスト： 1/19 の [ALGO ARTIS プログラミングコンテスト2025 冬（AHC041）](https://atcoder.jp/contests/ahc041)
* 長期コンテスト： 2/14~2/24 の [日本橋ハーフマラソン2025冬（AHC043）](https://atcoder.jp/contests/ahc043)

とは言ったものの、ツール類の使い方はだいたいどのAHCでも同じなので、一度は過去問を触っておく（やりこむまでの必要はない）とスムーズだと思います。

過去問を使って練習する場合、長期コンテストの方が問題内容が重たいことが多いため、まずは短期コンテストをやるのがよいです。

AHC017以降では YouTubeライブで [AHCラジオ](https://www.youtube.com/playlist?list=PLLeJZg4opYKY6yCPd7j0b5NS4b7krV2yF) が開催されており、参加者のレベル帯ごとに何をすればスコアを上げられるのかが解説されています。 
まずは自力である程度問題に取り組んでみた後、AHCラジオを見て考え方を吸収するのがおすすめです。 
自分で解く際は、コンテスト時間は4時間であっても必ずしも4時間かけなくて良く、いったん満足したら区切りでよいと思います。逆にもっと時間をかけてやるのもアリ。

::: note info
「焼きなましもビームサーチも習得していないのにヒューリスティック参加して良いか？」というのを気にされてる方をたまに見かけますが、気にせず参加しましょう。 
「セグ木をマスターしてないがABCに出て良いか？」みたいなものです。
（それを使わないと上位に入るのが難しい回はあるが、使えないからといって出ていけないことはないし使わずに優勝できることもある）
:::


## 他の情報源

* [AtCoder Clans 「ヒューリスティック問題を解く」](https://kato-hiro.github.io/AtCoderClans/articles/heuristic/)
* [マラソンマッチで誤解してたこと、してなかったこと](https://koyumeishi.hatenablog.com/entry/2018/12/28/055220)
    * （※マラソンマッチ = topcoderで開催されているヒューリスティックコンテストの名前）
* 他にも何か載せようと思ったが思いつくのはみんなClansで網羅されていた