AHCのツールについて　第一回　概要(ビジュアライザについて）

# 自己紹介

(ほとんどの人が)初めまして
uetaと申します。
電気機械系の大学院2年で研究はなぜか統計系統のことをやっています。

# 競技プログラミングとは

一般に競技プログラミングは略して競プロと呼ばれるのですが
競プロと呼ぶと大半はアルゴリズムのほうをさしますが、今回はアルゴリズムではなく、ヒューリスティック（マラソン）のほうについて書こうと思います。

ヒューリスティックとは最適な解を算出することが難しい問題について
制限時間内に算出可能なより良い解を求めるというものである。
もっと詳しく知りたい方は以下を参考にしてください。

https://qiita.com/tanaka-a/items/3c2a1bca63759ec71e7f


今回は、マラソン系特にAHC用ツール（入力ジェネレータ・ビジュアライザ・ローカルテスタ）の使い方を説明したいと思います。
>（できる人はみんな当たり前のようにつかってしまうので、初めてやった時ここの説明がなくて正直困った。。。。）

間違っていた場合は連絡ください。
よろしくお願いいたします。

# 今回の目的

競技プログラミング特にAtcoderというサイトで提供されるツールの使用方法を説明します。
本サイトではマラソン系のコンテストは<b>Atcoder heuristic Contest</b>、通称AHCと呼ばれています。

今回はこちらで提供されるツールを使うときの使用方法です。




割と新しいコンテストだと
以下のようにツールが与えられます。

![Screenshot 2022-12-15 232120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695016/dc11d0d1-0a5a-dd41-e6f7-ac8e8b71ed4b.png)

これです。

# 構成
第一回　ビジュアライザについて ←今回
第二回　[Windowsでの実行方法](https://qiita.com/ueta7/items/31de0301bfce4b95aaf9)
第三回　[Ubuntu, WSLでの実行方法](https://qiita.com/ueta7/items/1b67bb2fe30e95c42e9a)

## これは何？

- ### ビジュアライザ

コンテストで使った入力値に対する結果を図示するのに用います。
グラフであったり、マップであったり図描写を可能にします。

- ### 入力ジェネレータ・ローカルテスタ

これらを使うと自分のPC、ローカル環境で実行できるようになり結果を確かめられます。

##### 今回はビジュアライザの概要ついて説明します。（入力ジェネレータ・ローカルテスタはこちら）

# ビジュアライザとは

<b>回によってはローカル環境でビジュアライズする機能が与えられることがありますが、
ここではサイト上で図示が可能なweb版について説明します。</b>

<b>web版</b>　というところを押すとサイトにつながります。

これはローカルでビジュアライザするよりも高機能なものが与えられることがあり、頻繁使うことをお勧めします。


コンテストで使う、グラフであったり、マップであったり図描写を可能にします。
これは基本的には結果の確認に使います。
# なぜ、ビジュアライザが必要か？

ビジュアライザは結果を表示するために使います。
例えば: [AHC17](https://img.atcoder.jp/ahc017/a7a9e57e.html?lang=ja)において、出力で以下のようなものを出力したとします

```
10 8 4 8 10 11 3 5 9 7 11 10 10 5 11 2 10 9 7 2 11 4 7 8 6 3 1 ...
```

これではどのような結果になっているかがわかりません。
これをweb版ビジュアライザを利用すると以下のように結果を直感的に確認できます。
以下の画像は[AHC17](https://atcoder.jp/contests/ahc018/tasks/ahc017_a)より。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695016/1aac48cd-a68d-36cb-b4ef-49ae813ffd40.png)


<b>ヒューリスティックコンテストは図示して初めて結果が理解出るものが非常に多いです。</b>
また、得点の算出もしてくれ、エラーの時は「Invalid」等で表示されるのもよい点です。

また、それにコメントをつけて毎回の出力に対してほかのデータに誤りがないかを確認することも可能な回もあります。

このように、メリットが数多くあります。
これを有効的に使うことでかなり有利に進めることが可能です。

# 実際の使い方
これは[HTTF本戦](https://atcoder.jp/contests/future-contest-2023-final-open/tasks/future_contest_2023_final_a)を復習したときのビジュアライザの結果です。

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695016/8d48ee5b-d633-720b-7a94-d8f11ec6d1dd.png">

<b>seed値のところに数字(０以上の整数）を入力するか、「Input」の部分に直接コピペします。
入力値に対応する「Output」の部分に結果を張り付けると表示されます。</b>

使い方はビジュアライザの「詳細」より確認してください。
コンテストによって細かい使い方が異なります。



<details>
<summary>seedとは？</summary>
回によって細かい手法は異なります。
基本的に入力値はseedを基に乱数を用いて作成されます。
seedとは乱数を生成するのに使う値のことを指します。
これを指定することで、乱数値を固定することができます。

例えば、pythonなら
```python:a.py 
import random
print(random.randint(0,10000000000))
```

これを複数回実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695016/b2aaa60c-bb36-cf30-1686-621526960db2.png)

以下のように完全ランダムな数字が出力されます。

しかし、シード値を固定すると
```python:a.py 
import random
random.seed(314)
print(random.randint(0,10000000000))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695016/836ad7ec-0a8d-37ba-5354-93d376046bbc.png)

このように乱数を固定することができ、固定の乱数にすることができます。

よって、シード値を与えると乱数にもかかわらず、同じ環境を用いれば誰でもどこでも必ず同じ入力値を得ることが可能になります。
</details>

## 最後に

ビジュアライザを使い、プログラムがどのように作用しているかを何回も確認しましょう。
ビジュアライザをいかにうまく使うかで、コードの修正時間やコンテストの出来が大きく変わります。
ぜひ有効活用しましょう。

# 次回
次はWindowsでの実行ファイル、実行コマンドについて[次回](https://qiita.com/ueta7/items/31de0301bfce4b95aaf9)にまとめたいと思います。