Yuulis.log

Yuulis.log

トンネルを抜けるとそこは参照エラーであった。

【VScode + WSL / Windows】C++ 用の AtCoder 向け環境構築をしてみた。(WSL導入からGitによるソースコード管理まで)

はじめに

以前、3年間使い続けた VScode をいったんリセットして、拡張機能などをすべて削除した。

yuulis.hatenablog.com

ということで、今回はこの VScodeC++ 用の AtCoder の環境構築をしていく。

私は今まで AtCoder の環境には Visual Studio を使用していた。確かにビルドやデバッグの操作は簡単に行えるのだが、とにかく重い。私の PC のスペックのせいもあるが、問題を解きながら裏でブラウザを使っていろいろ検索しようとするとスムーズにいかないことが時々あり、これが以前からの悩みの種だったのである。そこで、この機にどうせなら VScode に環境を移行してしまおうと思い立った。

...ここまではいいのだが、私が VScode 上で WSL を動かすのに慣れていなかったのもあり、予想以上に環境構築で沼ったため、約3日間を費やしてしまった。再びこの環境構築をする際に同じ目に合わないよう、ここに記録しておく。

環境構築の目標と前提条件

Windows 上に作ると元々の Windows の環境を汚してしまうことになりあまり好きではないので、 WSL を使うことで Linux 仮想環境上に C++ のローカル実行環境を構築していく。

どのような環境を作るのか

  1. コンテストが始まったら、 VScode 上でそのコンテストのディレクトリを作成し、各問題ごとに提出用ファイルを作成する。
  2. プログラムを書き終えたらそのプログラムをビルド。
  3. VScode 上で自動でサンプルケースを回し、結果を表示。
  4. 問題があれば適宜デバッグを実行。
  5. 最終的に VScode から提出を行い、結果を確認する。
  6. コンテスト終了後、 Git を利用してプログラムを Github リポジトリに記録・保存。

理想的な VScode 上のディレクトリ構成はこんな感じ。

root/
  └ AtcoderSolution/
                     ├ (コンテスト名)/
                     |    ├ (問題番号)/
                     |    |  ├ test/  # テストケース
                     |    |  |   ├ sample-1.in
                     |    |  |   └ sample-1.out
                     |    |  └ main.cpp  # 提出用ファイル
                     ├ a.out  # 実行用ファイル
                     └ debug.in  # デバッグ用のケース入力用ファイル

前提条件

  • OS が Windows である。
  • VScode をインストール済み。

WSL を VScode 上で使えるようにする

zenn.dev

こちらを参考にしながら、まずは VScode 上に WSL の環境を構築していく。

1. VScode 拡張機能「WSL」をインストール。

2. アクティビティバーに追加された「リモートエクスプローラー」をひらき、「WSLターゲット」>「ディストリビューションを追加する」>「Ubuntu (最新LTSバージョン)」を選択。
3. default UNIX user accountを作成。ユーザネームとパスワードを入力する。このとき、パスワードは入力しても表示されないので注意。
4. インストール完了後、左下の「≶」のようなボタンを押して Remote 環境に移行する。

WSL 環境に gcc と g++ をインストールする

前項で作成した WSL 環境に、 C++コンパイラである gcc と g++ をインストールしていく。

1. とりあえず、 gcc と g++ のインストール状況を確認。

$ gcc --version
$ g++ --version

2. インストールされていない場合は、以下のコマンドでインストールする。

$ sudo apt install gcc

3. fetch に関するエラーが出たら、apt-get(パッケージ管理コマンド)を更新。

$ sudo apt-get update

参考記事で記載されていた以下のエラーは起こらなかったので、先を進める。

E: Release file for http://archive.ubuntu.com/ubuntu/dists/jammy-backports/InRelease is not valid yet (invalid for another 20h 18min 53s). Updates for this repository will not be applied.

4. build-essentialをインストール。

$ sudo apt-get install build-essential

5. インストールの確認。バージョン情報が表示されれば成功。

$ gcc --version
$ g++ --version


2024/08/02 追記
上記のコマンド実行で gcc や g++ のバージョンが11.x.xだった場合は、 AtCoder のジャッジアップデートで対応した C++20 や C++23 の機能が使えない。こういうときは、以下の記事を参考にしてバージョン12.x.xコンパイラをインストールすることを推奨する。

yuulis.hatenablog.com

^^^^^ 追記ここまで ^^^^^

WSL 環境に C++ 用の拡張機能をインストールする

以下の拡張機能を好みに応じてインストールする。太字のものは必須の拡張機能

  • C/C++ Extension Pack (C/C++, C/C++ Themes, CMake, CMake Tools が同梱)
  • Command Runner
  • Intellicode
  • Intellicode API Usage Examples (Intellicode 導入で自動インストール)
  • Project Manager
  • zenkaku
  • Path Autocomoplete
  • Markdown Preview Enhanced
  • Material Icon Theme
  • indent-rainbow
  • Include Autocomplete
  • Git Extension Pack
  • Git History
  • gitignore
  • GitLens — Git supercharged
  • Open in GitHub, Bitbucket, Gitlab, VisualStudio.com !

AtCoder Library (ACL) を導入する

ACL とは、AtCoder 公式が提供している C++ 用のライブラリである。 AtCoder の問題でよくみられるアルゴリズムやデータ構造をライブラリ化したもので、これはジャッジサーバにもあらかじめ組み込まれているので、 AtCoderC++ を使っている人は導入しておいて損はないだろう。

1. AtCoder 用のディレクトリを作成する。理想のディレクトリ構成の図に従って、ここではAtCoderSolutionとした。

$ mkdir AtCoderSolution

VScode のコマンドパレットを開き、「WSL: Open Folder in WSL...」>「/home/(user-name)/AtCoderSolution」を選択。以降はこのディレクトリ下でコマンドを実行する。

2. 続いて、 ACL を以下のリンクからzip形式でダウンロード。わかりやすいところに展開しておく。

atcoder.jp

WindowsエクスプローラーでAtCoderSolutionディレクトリを開く。

$ explorer.exe .

ダウンロードしたac-libraryフォルダをAtCoderSolutionディレクトリにコピー。

atcoder-cli (acc) と online-judge-tools (oj) をインストールする

qiita.com

次にこの記事を主に参照しながら、VScode 上からテストケースのダウンロード、ソースコードの提出を自動で行えるようになる acc と、テストケースの自動実行をしてくれる oj を WSL 環境にインストールしていく。ここで、 npm を導入していない場合は、上記記事中で紹介されているこの記事を参考にする。

qiita.com

また、pip3 も導入していない場合は、以下に示す acc 開発者のブログを参考にすると良い。

tatamo.81.la

1. とりあえず pip3 と npm のバージョンを確認する。

$ pip3 --version
$ npm --version

2. インストールされていない場合は、以下のコマンドでまずは pip3 からインストールする。

2024/08/25 追記
WSL 環境に導入した Ubuntu のバージョンが 24.04 の場合、デフォルトで Python3.12 がインストールされるので、以降の処理で PEP668 に関するエラーが起こるようになる。

blog.jp.square-enix.com

これを回避するために、以下の記事を参考にして Python3.10.14 をインストールする。

macocci7.net

インストール後は

$ pyenv global python3.10.14

というコマンドを実行しておく。その後、

$ sudo apt-get install python3

というコマンドは実行せずにスキップして、 pip3 のインストールを行う。

^^^^^ 追記ここまで ^^^^^

この2つのコマンドを実行する。

$ sudo apt-get install python3
$ sudo apt install python3-pip

3. 続いて、 npm をインストールする。

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

実行後、一度ターミナルを再起動し、以下のコマンドを実行する。

$ nvm install node
$ npm install -g npm

4. 再び pip3 と npm のバージョンを確認する。

$ pip3 --version
$ npm --version

バージョン情報が表示されれば成功。

5. 次に、acc をインストールし、ヘルプコマンドを実行して動作確認。

$ npm install -g atcoder-cli
$ acc -h

使用可能コマンド一覧が表示されれば成功。

6. さらに、oj をインストールする。

$ pip3 install online-judge-tools

このとき、私の環境では以下のような警告が出た。

WARNING: The script normalizer is installed in '/home/(user-name)/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
WARNING: The script jsonschema is installed in '/home/(user-name)/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
WARNING: The script oj-api is installed in '/home/(userr-name)/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
WARNING: The script oj is installed in '/home/(user-name)/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

念のため

$ oj -h

を実行するも、

oj: command not found

となってしまう。どうやら、 PATH が通っていないらしい。ということで、root/home/(username)/.bashrcを開き、以下の内容を追記。

export PATH="$PATH:/home/(user-name)/.local/bin"

再び

$ oj -h

を実行して、バージョン情報が表示されれば成功。

WSL 環境上で AtCoder にログインする

前項で示した記事、あるいは以下に示す acc 開発者のブログを参考に進める。

tatamo.81.la

1. まず、acc と oj の連携状態を確認する。

$ acc check-oj

availableと表示されればOK。

2. acc で AtCoder にログインする。以下のコマンドで、AtCoderのユーザネームとパスワードを入力し、ログインする。なお、パスワードは入力しても画面に表示されない。

$ acc login

3. oj でも AtCoder にログインする。以下のコマンドを実行。先ほどと同様に AtCoder のユーザネームとパスワードを入力する。

$ oj login https://beta.atcoder.jp/

このとき、私の環境では

[ERROR] Selenium is not installed. Please run $ pip3 install selenium

というエラーが出たが、無視しても大丈夫なようだ。

atcoder-cli の設定をする

1. まず、コンテスト開始時にコマンドを実行した際、1回で全ての問題用ファイルを生成するように設定を変更する。

$ acc config default-task-choice all

2. 次に、提出用ファイルのテンプレートを作成する。 acc の設定ファイルが配置されたディレクトconfig-dirに移動する。

$ cd acc config-dir

3. このディレクトリにcppというディレクトリを作成。この名前がテンプレート名となる。そのディレクトリ下に、テンプレート用の C++ ファイル (今回はmain.cppとした) とtemplate.jsonを作成。template.jsonには以下の内容を記述する。

{
  "task":{
    "program": ["main.cpp"],
    "submit": "main.cpp"
  }
}

4. テンプレート用の C++ ファイルに内容を記述後、そのテンプレートが認識されているか確認する。

$ acc templates

cppという項目が表示されていれば成功。

5. 以下のコマンドで、今のテンプレートをデフォルトのテンプレートに設定する。

$ acc config default-template cpp

C++コンパイル設定をする

以下の記事を参考に C++ コンパイル時の設定をする。

qiita.com

1. AtCoderSolutionディレクトリ上に適当な C++ ファイルを作成し、それを選択している状態でCtrl + Shift + Bでビルドを試みる。すると、.vscode/tasks.jsonが生成される。

2. tasks.jsonを以下のように書き換える。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "c++ build for AtCoder",
            "type": "shell",
            "options": {
                "cwd": "${fileDirname}"
            },
            "command": "g++",
            "args": [
                "-I",
                "${workspaceFolder}/ac-library/",
                "-g",
                "-O0",
                "-Wall",
                "-Wextra",
                "${file}",
                "-o",
                "${workspaceFolder}/a.out"
            ],
            "group": "build"
        }
    ]
}

コンパイルオプションについては、以下の記事を参照。

triple-four.hatenablog.com

2024/03/16 追記
このままだとコンパイル時にACLを読み込めないエラーが出るので、tasks.json"args"に以下を追加した。

"-I",
"${workspaceFolder}/ac-library/",

^^^^^ 追記ここまで ^^^^^

IntelliSense 設定をする

1. コマンドパレットをから「C/C++:Edit Configurations(JSON)」を選択。すると、.vscode/c_cpp_properties.jsonが生成される。
2. c_cpp_properties.jsonを以下のように書き換える。

{
    "configurations": [
        {
            "name": "WSL",
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "/usr/bin/gcc",
            "includePath": [
                "${workspaceFolder}/**",
                "${workspaceFolder}/ac-library/"
            ],
            "defines": [],
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

2024/08/25 追記
C++23 を導入した場合は、上述の json"cppStandard"c++23になる。

^^^^^ 追記ここまで ^^^^^

コマンド割り当てとショートカットキーの設定

以下の記事を参考にし、 acc と oj コマンドを簡単なショートカットキーで実行できるようにする。

seiseiengineering.com

Command Runner にコマンドを割り当てる

先ほどインストールした拡張機能「Command Runner」のsettings.jsonを開き、以下の内容を追記する。

"command-runner.commands": {
        "oj test": "oj test -c ${workspaceFolder}/a.out -d ${fileDirname}/test",
        "acc submit": "cd ${fileDirname} && acc submit ${file} || cd ../../",
},

2024/08/25 追記

最近の AtCoder では、出力時の末尾の空白や改行の有無は無視されるようになっている。例えば、ジャッジケースが

```
1␣2␣3↵
```

だった場合、

```
1␣2␣3␣
```

のように出力しても問題ないということだ。 oj におけるテストケースチェックでもこの対応をするには、コマンドオプションとして-S -Nを追加する必要がある。

^^^^^ 追記ここまで ^^^^^

oj のコマンド詳細は以下を参照。

github.com

ショートカットキーの設定

1. Ctrl + K → Sを入力してキーボードショートカット一覧を開き、右上のファイルアイコンをクリックしてkeybindings.jsonを開く。
2. keybindings.jsonに以下の内容を追記する。

    {
        "key": "ctrl+alt+t",
        "command": "command-runner.run",
        "args": {
            "command": "oj test"
        }
    },
    {
        "key": "ctrl+alt+s",
        "command": "command-runner.run",
        "args": {
            "command": "acc submit"
        }
    },
    {
        "key": "ctrl+alt+b",
        "command": "workbench.action.tasks.build",
        "when": "taskCommandsRegistered"
    }

ここでは、「ビルド」をCtrl+Alt+B、「サンプルケース実行」をCtrl+Alt+T、「ソースコード提出」をCtrl+Alt+Sとした。

C++デバッグ環境を構築する

1. ターミナル上で以下のコマンドを実行し、 C++ のデバッガである gdb をインストール。

$ sudo apt install gdb

2. tasks.json作成時と同様に、適当な C++ ファイルを開いた状態でF5を入力すると、.vscode/launch.jsonが生成される。
3. launch.jsonを以下のように書き換える。

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "preLaunchTask": "c++ build for AtCoder",
            "request": "launch",
            "program": "${workspaceFolder}/a.out",
            "args": [
                "<",
                "${workspaceFolder}/debug.in"
            ],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; /bin/gdb -q --interpreter=mi",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

私の環境では"externalConsole": falseの部分をtrueとすると、デバッグがうまく実行されなかった。

また、デバッグ終了時に、ターミナルに

[1] + done /usr/bin/gdb --interpreter=mi --tty=${DbgTerm} 0</tmp/Microsoft-MIEngine-In-ndptacu6.2ri 1>/tmp/Microsoft-MIEngine-Out-9278nini .hzx

のような謎の文字列が表示されることがある。デバッグに関して直接的な影響はないのだが、この表示を消したい場合は上記のように

"miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; /bin/gdb -q --interpreter=mi"

を追記しておくこと。詳しくは Github 上の下記 Issue を参照。

github.com

WSL 環境上に Git を導入する

以下の記事を参考に、 WSL 環境上に Git を導入していく。
ylabdesk.com

Git の初期設定

以下のコマンドで、 Git を使うユーザのEメールアドレスとユーザネームを登録する。

git config --global user.email "(GitのEメールアドレス)"
git config --global user.name "(Gitのユーザネーム)"

WSL から GithubSSH接続する

1. root/home/(username)/.sshを作成し、そのディレクトリ下で次のコマンドを実行。秘密鍵と公開鍵のペアが作成される。

$ ssh-keygen -t rsa

2. Enter file in which to save the key (/home//.ssh/id_rsa):と聞かれるので、鍵の名前を入力する (デフォルトではid_rsa) 。
3. Enter passphrase (empty for no passphrase):と聞かれるので、パスワードを入力する。入力したパスワードは表示されないので注意。空白の場合はパスワードを設定しないことになる。
4. 以下のページにアクセスして、 Github に先ほど生成した鍵の公開鍵の方を登録する。

github.com

「New SSH Key」をクリックし、「Title」には何のSSH鍵なのか分かりやすいように適当に付ける。また、「Key」には、次のコマンドを実行してグリップボードにコピーされる先ほど作成した公開鍵をペーストする。

$ cat ~/.ssh/id_git_rsa.pub | clip.exe

入力が終わったら、「”Add SSH key」で公開鍵を登録する。

作成した秘密鍵は絶対に第三者に漏洩しないように注意すること。漏洩した場合、 Githubへの不正アクセス及びソースコード盗用の恐れあり。公開鍵は最悪漏洩してもセーフ。

5. .ssh/configを開き、以下の内容を追記する。

Host github
HostName github.com
IdentityFile ~/.ssh/(秘密鍵の名前)
User git

6. 以下のコマンドで権限の修正をする。

$ chmod 600 ~/.ssh/config

7. 以下のコマンドで接続の確認をする。

$ ssh -T git@github.com

Hi (githubアカウント名)! You've successfully authenticated, but GitHub does not provide shell access.と表示されれば成功。

Github 上のリモートリポジトリと紐づける

初回の push 時に限り、特別な操作を行う必要がある。以下の記事を参考に進めていく。また、この段階で既に WSL 環境上に Git はインストールされているはずである。

qiita.com

1. ローカルのリポジトリを初期化する。

$ git init

2. (必要があれば) ローカルのブランチ名をmasterからmainに変更する。

$ git branch -m main

3. .gitignoreを作成し、以下の内容を追記する。

.vscode/**
!c_cpp_properties.json
!launch.json
!tasks.json

ac-library/**

*.in
*.out

4. VScode 上 の Git の UI から、「変更をステージ」>「コミット」を選択。
5. Github 上でリモートリポジトリを作成し、そのurlをコピーしておく。今回はこのリポジトリを作成した。

github.com

6. 次のコマンドを順に実行する。Github リポジトリのurlは、最後に.git が付いたものである。

$ git remote add origin (Github上のリポジトリのurl)
$ git fetch origin
$ git merge --allow-unrelated-histories origin/main
$ git push origin main

おわりに

以上で、冒頭に示した環境を構築することができた。

工程が非常に多いので、予期せぬエラーなどで途中で詰まってしまうことが十分に考えられる。エラーが出てきたら自分で調べてみるのはもちろんだが、それでもなかなか解決しないかもしれない。行き詰ったら最初からやり直してみるのも一つの手であろう。幸いなことに、今回は仮想環境上で環境構築を行っているので、簡単にリセットすることができる。詳細は《おまけ》の項を参照してほしい。

実戦で使いにくいところがあれば適宜修正しながら、以降はこの環境で精進していこうと思う。

15000字の記事とか久しぶりに書いたな...

《おまけ》WSL のディストリビューションを削除してやり直す場合

次の記事を参考に、WSL のディストリビューションを削除して、「WSLターゲット」>「ディストリビューションを追加する」を選択するところからやり直すことができる。

zenn.dev

1. 既存のディストリビューションを確認。

$ wsl -l -v

2. 削除したいディストリビューションNAMEを指定して削除。

$ wsl --unregister (削除したいディストリビューション名)

3. 削除されたことを確認。

$ wsl -l -v

以降はこちらと同じ。

【AtCoder】AtCoder Beginner Contest 424 - 参加記 | 緑コーダーが解くAtCoder

atcoder.jp

コンテスト時間: 2025-09-20(土) 21:00 ~ 2025-09-20(土) 22:40 (100分)

A - Isosceles

Difficulty: ??? / NoviSteps: ???

解答時間: 1:13


  • 面積が正である三角形 ABC があり、三辺の長さはそれぞれ  a,b,c である。三角形 ABC が二等辺三角形であるか判定せよ。

  •  a = b = c なら正三角形なので Yes 。
  • そうではなく、  a = b または  b = c または  c = a なら Yes 。そうでなければ No 。

B - Perfect

Difficulty: ??? / NoviSteps: ???

解答時間: 3:24


  •  N 人が  M 問からなるプログラミングコンテストに参加した。このコンテストでは  K 個のイベントが順番に起き、  i 番目のイベントは以下の通り。
    •  A_i が問題  B_i に正解した。
  • すべての問題に正解した人の番号を全員出力せよ。そのような人が複数いる場合は、すべての問題に正解したタイミングが早い順に出力せよ。

  • 各参加者がどの問題を解いたかをシミュレーションしていき、イベントが起きるごとにその人が全問正解しているかをチェックすればよい。

C - New Skill Acquired

Difficulty: ??? / NoviSteps: ???

解答時間: 12:13


  •  1 から  N の番号がついた  N 個のスキルがある。  N 個の整数の組  (A_1,B_1), \dots,(A_N,B_N) が与えられ、  (A_i,B_i)=(0,0) のときスキル  i を習得済みである。そうでないとき、スキル  A_i,B_i の少なくとも一方を習得済みのときに限りスキル  i を習得することができる。既に取得済みのスキルも含め、最終的に習得することができるスキルの個数を求めよ。

  • スキル習得のための依存関係は有向グラフで表すことができる。
  • すでに習得済みのスキルを始点として、このグラフに対して BFS / DFS を行えばよい。

D - 2x2 Erasing 2

Difficulty: ??? / NoviSteps: ???

解答時間:25:30


  •  H \times W のマス目があり、各マスは白または黒に塗られている。高橋君は  0 個以上の黒く塗られたマスを白に塗り替えることで、マス目が黒く塗られたマスのみからなる  2\times 2 の部分を持たないようにしたい。高橋君が目標を達成するために、白く塗り替える必要のあるマスの個数の最小値を求めよ。 T 個のテストケースが与えられるので、それぞれについて答えを求めよ。

  •  H, W の制約が非常に小さく、頑張れば全探索できそうな気もする。
  • 「各マスを黒に塗るか白にするか順番に決めていく」という愚直な方法では  2^{HW} の場合があり、そのままでは TLE してしまう。
  • しかし、以下のような枝刈りができるので実際の探索量はそれほどでもなさそう。
    • 元々白のマスを黒にすることはできない。
    • 探索途中に暫定最小コストよりもコストが大きくなったら探索を打ち切る
    • 黒に塗ると決め打ったときに、  2 \times 2 の領域ができたら探索を打ち切る
  • これを基に、左上のマスから色を決めていくという再帰全探索(DFS)を行うことができる。

  • 実は答えの最大値が  9 なので、この枝刈りが間に合いそうだということも考えることができる。

結果

Performance: 1275

1167 → 1178 (+11) Highest更新!

atcoder.jp

前回の負けを取り返せた。

【大阪・関西万博2025】大学生の2泊3日ソロ万博レポ | ① 準備編

9/3から9/5にかけて、話題の大阪・関西万博に行ってきた。せっかくなので、このシリーズではそのときの記録をまとめておくことにする。

  • ① 準備編 : イマココ
  • ② 1日目(移動・夜間券入場) : 後日投稿予定
  • ③ 2日目(一日券入場) : 後日投稿予定
  • ④ 3日目(一日券入場・帰宅) : 後日投稿予定

準備編では、来場2か月前からの私の動きと、シャトルバスや宿泊地の予約、事前に購入していたモノなどを紹介していく。

このシリーズで説明する内容は9/5現在の情報なので、既に過去のものとなって通用しない可能性もある。

チケットの購入・日時指定

元々大学の夏休みの後半の9月上旬に行こうかなと考えていたので、約2か月前の7/2にチケットを3枚購入。1枚は夜間券で、残りの2枚は平日券である。

東京に住んでいるということもあり、初日は移動で午前中が潰れることになるので、夜間券を購入して16時から入場することにした。本来は17時入場の枠だが、「トワイライトキャンペーン」というやつで入場時間帯を1時間繰り上げることができる。

www.expo2025.or.jp

チケットは購入するだけではダメで、来場日時を予約する必要がある

9/3から9/5の2泊3日の日程で、当初は以下のような予約を取っていた。

  • 9/3 : 東ゲートから16時入場
  • 9/4 : 西ゲートから9時入場
  • 9/5 : 西ゲートから10時入場

その後、2日前の入場枠拡大で、9/5の入場時刻を9時に繰り上げることができた。

なお、2か月前の時点で既に9時入場枠は黄色や赤の表示がたくさん。万博ガチ勢怖いです...

宿泊地

宿泊地について。大阪市内はどこも1泊1万円~というところがほとんどだったので、兵庫県尼崎市周辺を探すことに。

こういうときはなんだかんだ東横INNが安定している。

www.toyoko-inn.com

学割を利用して1泊8000円台で泊まることができた。

シャトルバス

万博に西ゲートから入退場する際は、シャトルバスの利用がほぼ必須となる。

万博関連のシャトルバスは、ほぼすべて事前予約制。 KANSAI MaaS というサイトから予約することになる。

app.kansai-maas.jp

ホテルがある尼崎からは駅から万博会場へ直行するシャトルバスがあったのだが、2か月前の時点で早朝便は満席...

仕方がないのでJR桜島駅から万博会場へのシャトルバスを予約することにした。こちらは時間帯を指定して予約する形となっており、2か月前の時点では無事8時台の枠を予約することができた。

※ 後日、3日目のシャトルバスは新大阪駅 7:30 発のものに変更した。これは、ホテルチェックアウト後に荷物を新大阪駅に預けることにしたからである(後述)。

退場時は3日とも西ゲートからの予定であり、3日目は21時台の新幹線で帰ることにしていたので、21時台を2日分と、19時台を1日分確保した。

パビリオンの抽選・予約申し込み

会場内の一部のパビリオンは、事前に抽選や先着順で来場予約を取ることができる。公式サイトからの予約タイミングは2か月前7日前3日前の3回。

2か月前抽選

チケットの購入自体は7/2に行っていたのだが、2か月前抽選の開始タイミングを勘違いしていたため、1日目分の抽選タイミングを逃してしまった...

気を取り直して、2日目分と3日目分の抽選に参加する。

Twitter や色々なレポ記事を見る中で、抽選対象のパビリオンで個人的に目を付けていたのは、以下の通り。

希望枠は各日5枠まであるので、上記パビリオンを適当に並べていく。希望時間帯は、9時入場後に最速で並ぶパビリオンのことを考えて、午後の枠を中心に入れていった。

その結果、以下の2枠が当選した。

いずれも第一希望だったので、無事当選して良かった。特にシグネチャーパビリオンは原則予約のみなので、2か月前で確保できたのはでかい。


各パビリオンの抽選枠数等は、公式からだと以下のように発表しているので、参考になるかも。

www.expo2025.or.jp

7日前抽選

2か月前抽選で第2希望以下に置いたものを繰り上げて並べていく。ここでは国内パビリオンを優先して午後の枠に入れた。


...が、なんと3日分全て落選。計15枠もあって全滅は考えていなかったので愕然としたが、おそらく人気どころを取り合ってしまったのだろう。

3日前空き枠先着

これまでは「抽選」だったが、ここでは「先着」である。会期も終盤となり様々なノウハウが蓄積されてきているので、適切な手順を踏みさえすれば、あとはインターネット回線の強さと操作速度の勝負となる。

3日分のチャレンジでようやくその「適切な手順」というものを自分なりに編み出せたような気がするので、一応ここに残しておく。

ただし、最近になって予約ページ関連で内部システムのアップデートが入ったらしく、もうこの手法は通用しないかもしれない。


このとき、「サイトにアクセスできる推定時刻」が 23:50 ~ 23:58 付近になっているとベスト。マイチケットのページは、15分間操作がないと自動的にログアウトされて、再び待機列に飛ばされてしまうという仕様があるようで、 0:00 ぴったりに先着予約のページにアクセスできるようにするためには、ログインページに23:50 台に到達できるようにするのが最適だと思われる。

これ以降、万博関連で幾度となく目にする画面

  • 待機列を抜けたら、マイチケットに落ち着いてログインする。
  • その後、予約・抽選の申し込みページへアクセスし、0:00 ちょうどまで待機。定期的にリロードしておくと安心。
  • 0:00 ちょうどになると、下図の「空き枠先着予約」の「空き枠先着に申し込むチケットを選択」というボタンが赤くなり Active になるので、すかさずクリック。ここで、エラーになっても諦めずにリロードし続けるのが重要。
  • 申し込むチケットを選択したら、パビリオン・イベントの選択画面になる。ここで、既に目的のパビリオンが決まっている場合は検索窓にその名称を入れて検索。そうでない場合は、空欄のまま検索ボタンを押せばよい。
  • 運が悪いと、ここで再び待機列のページに飛ばされる可能性がある。この時点で「サイトにアクセスできる推定時刻」が 0:10 以降だった場合は残念ながら望み薄...
  • 検索結果が表示されたら、目的のパビリオンと時間帯を選択する。時間帯についてだが、既に「△」表示の箇所はいわゆる「残像」であり、今から予約を取ろうとしても取ることができない場合がほとんどである。「〇」表示の箇所を狙うこと。


この結果、私は

  • 1日目(9/3) : 飯田グループ×大阪公立大学共同出展館 18:00 ~ 18:30
  • 2日目(9/4) : 「未来の都市」 参加型シアター入場付き : 14:00 ~ 14:20
  • 3日目(9/5) : オランダパビリオン コモングラウンド : 14:30 ~ 15:00

の枠を取ることができた。3日目にオランダ館を取れたのはまあまあデカかったのではないだろうか。

手荷物預け場所について

万博会場内へは、スーツケースをはじめとしたデカい荷物やキャスター付きの荷物を持ち込むことができない。

www.expo2025.or.jp

会場内にも荷物預かり所は存在するが、数が少ない上に1個1万円というとんでもないペナルティ。会場外の適当な駅などに預けてから来るのが良いだろう。

私は3日目に新大阪駅から新幹線で帰る予定だったので、ホテルのチェックアウト後は新大阪駅内にある「新大阪Luggage Station」にスーツケースを預けることにした。

mk.luggage.teburakun.com

ここでは、事前予約制で1個1000円から手荷物を預けることができる。場所は新幹線中央改札口前のエスカレーターを降りてすぐなので、アクセスも良好。

当日の持ち物

ここでは、私が万博に行くにあたって持ち込んだものを紹介していく。

折りたたみ椅子

頻繁に行列に並ぶことが予想されたので、折りたたみが可能な椅子を持っていくことにした。

ちょうど期間限定の PayPay 1500 ポイントが配布されていたので、 Yahoo! ショッピングで以下の商品を購入。

store.shopping.yahoo.co.jp

折りたたみ椅子の利点は、あらゆる場所で手軽に休憩所を作ることができるところにあると思う。

レビューでいくつか散見された「上下の円盤を回すのに握力が必要」というところも、私はほとんど気にならなかった。

実際に万博会場でも多くの人がこのタイプの椅子を持って行列に並んでいたので、これはマストバイではないだろうか。

日傘

「男で日傘を持つなんて...」と言っている場合ではない

万博会場は、大屋根リングを除けば日陰の場所がほとんどなく、ゲートでの待機列や各パビリオンの行列において、晴れていれば直射日光に晒され続けることになる。

後述の日焼け止めや帽子はもちろん、晴れ予報であれば日傘の携帯が必須であろう。9月に入っても残暑は厳しい。

ということで私は以下の商品を購入。

www.ascenteonlinestore.com

サイズ感は申し分ないが、会場は海沿いということもあって風がまあまあ吹く。若干風に煽られやすいかな?という印象であった。

金に余裕があれば mont-bell の日傘とか欲しいんだけどな。

暑さ・日焼け対策

暑さ・日焼け対策として日傘以外に準備したのは、主にこんなもの。

万博へは水筒よりもペットボトルをオススメする。中身の入った水筒というのは意外と重いし、会場内では160円から500mlの水が買える。台数も多く並ぶことはほとんどないと思われる。むしろ給水機の方が並んでいた...

あお、意外とリュックサックは背中が蒸れる。荷物を少なくできるなら、ショルダーバックで回るのが良いかもしれない。

雨具

私が訪れた期間中はちょうど台風15号が接近しており、本降りの雨も予想されていた。

特に、朝のゲート開放の待機中に雨に降られると厄介だと思っていたので、折りたたみ傘だけではなく雨合羽も用意していた。

結果的には後者の出番はなく、折りたたみ傘で十分しのげる雨風だったので一安心。

その他 / 情報収集関連

だれでも万博(仮)

実は、万博マニアらが集まるコミュニティが Discord 上に存在する。

discord.com

会場内の現地実況や質問用チャンネルなどが用意されているので、ROM専でもいいので入っておくのをオススメする。

@t_tsuji さんの地図のプリント

万博公式マップ は微妙に使いにくいものだったので、界隈で話題となっていた @t_tsuji さん作のマップを、コンビニで印刷していった。

ちなみに、9/13に公式マップ Ver.2 が公開されたらしい。 Ver.1 に比べたらかなり分かりやすくなったかも?

チケットの印刷

ゲート入場時や予約したパビリオンの入館時には、スタッフにマイチケットのQRコードを提示する必要がある。

しかし、マイチケットのサイトは一定時間操作がないと強制ログアウトされてしまう上、通信状況が悪かったり、アクセスが集中していたりすると、タイミングよくQRコードを表示できない場合がある。

そこで私は、事前にQRコードを紙媒体に印刷しておいた。マイチケットの各チケットのページから「QRコードを表示する」を押して「印刷」するだけ。

万博GO

有志の方が作ってくださった万博関連の情報サイト。パビリオンの情報だけでなく、レストランやグルメ情報も掲載されている。

「パビリオン待ち時間」というページには、先ほどの Discord 鯖の現地実況を基に、現在のパビリオンの待ち時間が表形式でまとめられている。

当日に予約なしで並ぶ場合に有用なので、このページをブックマークしておいた。

expo2025.fun

当日予約状況 - 大阪・関西万博2025

入場ゲート通過後10分程度経過すると、マイチケットから当日予約をすることができる。各パビリオンの当日予約枠は定期的に解放され、その幅は抽選や先着予約のものよりも広い。

...のだが、実質的に予約できるのは朝9時入場して速攻で確保した枠のみ。午前中の当日予約枠を消化したから次の予約をしようと思っても、表示されているのは「△」ばかり。つまり残像である。

かといって、会場内でずっとスマホをスワイプしているわけにもいかない。

ということで、私は朝一番の当日予約を速攻で行えるようにするためだけに以下のサイトをブックマークしておいた。

expo.ebii.net

使い方はサイト参照のこと。

準備編のまとめ

  • 当日予約はほとんど取れないので、事前抽選・先着予約を活用する。
  • 折りたたみ椅子は必須、晴れ予報なら日傘も。
  • チケットのQRコードとマップは印刷して持っていく。
  • シャトルバスは事前予約しておく。

【AtCoder】AtCoder Beginner Contest 423 - 参加記 | 緑コーダーが解くAtCoder

atcoder.jp

コンテスト時間: 2025-09-14(日) 21:00 ~ 2025-09-14(日) 22:40 (100分)

A - Scary Fee

Difficulty: ??? / NoviSteps: ???

解答時間: 4:16


  • ある銀行の通帳からお金を引き出すには、  1000 円単位で引き出し額を指定したうえで、引き出し額  1000 円あたり  C 円の手数料を残高から別途支払う必要がある。残高が  0 円未満になる引き出しを行うことはできない。通帳の残高が  X 円のとき、最大で何円を引き出せるか求めよ。

  • 求める条件は、 m を整数として以下のように書ける。
    •  1000m + Cm \leq X \iff m \leq \frac{X}{1000 + m}
  • これを満たす  m の最大値は  \left\lfloor \frac{X}{1000 + m} \right\rfloor だから、これを  1000 倍したものを答えとすればよい。

B - Locked Rooms

Difficulty: ??? / NoviSteps: ???

解答時間: 3:16


  •  N + 1 個の部屋が一列に並んでおり、部屋の間には  N 個のドアがあり、ドア  i は部屋  i - 1 と部屋  i の間にある。各ドアについて鍵の状態を表す値  L_i が与えられ、  L_i = 0 のときドア  i の鍵は開いており、  L_i = 1 のとき閉まっている。2人の人がおり、1人は部屋  0 に、もう1人は部屋  N にいる。それぞれの人は、ドア  i の鍵が開いているときに限り、部屋  i - 1 と部屋  i の間を移動することができる。このとき、2人のいずれも到達できない部屋の個数を求めよ。

  • 両端からの2人の動きをシミュレートし、到達できた部屋のインデックスを求める。
  • その後、両者の差から答えを求めればよい。

C - Lock All Doors

Difficulty: ??? / NoviSteps: ???

解答時間: 20:52


  •  N + 1 個の部屋が一列に並んでおり、部屋の間には  N 個のドアがあり、ドア  i は部屋  i - 1 と部屋  i の間にある。各ドアについて鍵の状態を表す値  L_i が与えられ、  L_i = 0 のときドア  i の鍵は開いており、  L_i = 1 のとき閉まっている。高橋君ははじめ部屋  R におり、ドア  i の鍵が開いているときに限り部屋  i - 1 と部屋  i の間を移動でき、部屋  i - 1 または部屋  i にいるときに限りドア  i の鍵に対して開閉操作を行うことができる。すべてのドアの鍵が閉まった状態にするために行う鍵の開閉操作の回数として考えられる最小値を求めよ。

  • 鍵が閉まっているドアの中で、インデックスが最小のものを  l 、最大のものを  r とする。
  • すると、高橋君が訪れるべき部屋の範囲は  [m_l, m_r ] = [ \min(l, r, R), \max(l, r, R) ] と求められる。
  • この範囲において、  L_i = 1 となる  i の個数を  c とすれば、  m_r - m_l + c が答えとなる。

D - Long Waiting

Difficulty: ??? / NoviSteps: ???

解答時間: 32:29


  • 同時に最大  K 人の客を入れられるレストラン店があり、1つの待ち行列を管理している。時刻  0 の時点で店内に客はおらず、待ち行列も空である。今日は  N 個の団体客が来る予定であり、団体客  i の人数は  C_i 人で、時刻 A_i待ち行列の末尾に加わる。また、この団体客は入店してから  B_i 単位時間後に退店する。それぞれの団体客は、以下の2条件が同時に満たされた最も早い時刻に、待ち行列を離れて入店する。
    • その団体客は、待ち行列の先頭にいる。
    • その団体客と、店内にいるすべての団体客の人数を合算すると、  K 人以下になる。
  • それぞれの団体客が入店する時刻を求めよ。

  • 団体客の「列に並ぶ」と「退店」をイベントとして扱い、priority_queueを用いながらイベントソートの要領でシミュレーションしていけばよい。
  • 自作構造体をpriority_queueに突っ込む際は、比較関数を自分で定義する必要があるので注意(1敗)。

結果

Performance: 1072

1177 → 1167 (-10)

atcoder.jp

D問題の実装を手間取り過ぎた。

【AtCoder】AtCoder Beginner Contest 422 - 参加記 | 緑コーダーが解くAtCoder

atcoder.jp

コンテスト時間: 2025-09-07(日) 13:10 ~ 2025-09-07(日) 14:50 (100分)

A - Stage Clear

Difficulty: ??? / NoviSteps: ???

解答時間: 2:51


  • あるゲームにはワールドが  8 つあり、それぞれのワールドにはステージが  8 つずつある。最初のステージは  1 個目のワールドにある  1 個目のステージであり、  i 個目のワールドにある  j 個目のステージの次のステージは、以下のように定まる。
    •  j\lt8のとき、次のステージは  i 個目のワールドにある  j+1 個目のステージである。
    •  i\lt8,j=8 のとき、次のステージは  i+1 個目のワールドにある  1 個目のステージである。
    •  i=8,j=8 のとき、次のステージはない。
    •  i 個目のワールドにある  j 個目のステージの名前は  i- j である。高橋くんが現在遊んでいるステージのステージ名  S が与えられるので、次のステージのステージ名を出力せよ。

  • ステージ名の規則はマリオと同じ。
  •  i = S_1, \, j = S_3 として、あとは規則通りに計算していくだけ。

B - Looped Rope

Difficulty: ??? / NoviSteps: ???

解答時間: 3:16


  •  H \times W のマス目があり、それぞれのマスは白もしくは黒のどちらかで塗られている。マス目が以下の条件を満たすか判定せよ。
    • どの黒で塗られたマスについても、上下左右で隣り合うマスのうち黒く塗られているものは  2 つもしくは  4 つである。

  • 制約が小さいので、素直に全探索すれば十分。

  • ライフゲームの実装で無限にこれをやっているから、もはや呼吸するように書けてしまう()

C - AtCoder AAC Contest

Difficulty: ??? / NoviSteps: ???

解答時間: 7:30


  • 高橋くんは、はじめA n_A 個、Bを [tex; n_B] 個、C n_C 個持っている。高橋くんは、Aを1つ、Cを1つ、さらに任意の1つの文字を使うことで、コンテストを1つ開催することができる。高橋くんは、現在持っている文字を使ってコンテストをなるべく多く開催したい。開催できるコンテストの最大値を求めよ。  T 個のテストケースが与えられるので、それぞれについて答えよ。

  • 開催できるコンテスト回数を  t 回とする。
  • まず、コンテストを開催するごとにA, Cを1個ずつ消費しなければならないので、  t \leq \min(A, C) が必要。
  • さらに、コンテストを1つ開催するには文字が3つ必要なので、  t \leq \left\lfloor \frac{n_A + n_B + n_C}{3} \right\rfloor も必要。
  • これらをまとめると、  t \leq \min(\min(A, C), \left\lfloor \frac{n_A + n_B + n_C}{3} \right\rfloor) となる。この  t の最大値が答え。

D - Least Unbalanced

Difficulty: ??? / NoviSteps: ???


  •  N を正整数として、長さ  2^N の非負整数列  A のアンバランスさを次の操作によって得られる非負整数値として定義する :
    • はじめ、  X=0 とする。
    • 次の一連の操作を  N 回行う。
      •  X \leftarrow \max(X, \max(A) - \min(A)) とする。
      •  A \gets (A_1 + A_2, A_3 + A_4, \dots, A_{\vert A \vert - 1} + A_{\vert A \vert}) とする。
    • 最終的な  X をアンバランスさとする。
  • 非負整数  K が与えられるので、長さ  2^N の非負整数列であって総和が  K であるものの中で、アンバランスさが最小値を取る数列を構成せよ。

  • 操作を行うごとに、数列は長さ  2^{N-1} の2つの数列に分割される。
  • 前後の総和をなるべく均等にしたいので、総和を前の数列は  \left\lfloor \frac{K}{2} \right\rfloor 、後ろの数列はその残りで考える。
  • これを再帰的に長さ  1 になるまで繰り返せば、あとは順次当てはめていくだけ。
  • ...ここまで考察できたは良いものの、時間が足りなくてACできず。悔しい。

  • ぱっと見で再帰解法を思いつかなくてE, F問題へ行ってしまい、そこで時間を食った形に。

E - Colinear

Difficulty: ??? / NoviSteps: ???

解答時間: 35:00 + WA x2


  • 2次元平面上に  N 個(奇数)の点があり、  i 番目の点は  (x_i, y_i) にあって、全ての点の座標は相異なる。  N 個の点のうち過半数を通る直線が存在するかを判定して、存在すればそれを出力せよ。

  • 求めるべき直線  l が存在すると仮定するならば、  N 個の点からランダムに選択した点がこの  L 上に存在する確率は  \frac{\frac{N+1}{2}}{N} 以上であり、これは  \frac{1}{2} を超える。
  • ある2点を通る直線は一意に定まるので、 N 個の点からランダムに選択した2点を通る直線が題意を満たす確率は  \frac{1}{4} である。
  • ランダム選択を  100 回程度繰り返せば、誤答を返す確率は  \left( \frac{3}{4} \right)^{100} \approx 3.20 \times 10^{-13} となり、ほぼ確実にACできる。

  • while文を用いて実装してたら、イテレーションを回すのを忘れて無限ループに陥っており2ペナ。

結果

Performance: 1368

1154 → 1177 (+23) Highest更新!

atcoder.jp

異例の日曜日のお昼開催となったABC。参加者が少ないと Performance が上に引っ張られて良いね。

D問題解ければ入水だったのになー

【AtCoder】ABC 420 C - Sum of Min Query | 緑コーダーが解くAtCoder

atcoder.jp

配点: 300 点 / 実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 169 / NoviSteps: 4Q

問題概要

長さ  N の整数列  A, B が与えられる。  Q 個のクエリが与えられるので順に処理せよ。  i 番目のクエリは以下のようになる。

  • 文字  c_i と整数  X_i,V_i が与えられる。  c_i=Aならば  A_{X_i} を、  c_i=Bならば  B_{X_i} V_i に変更する。その後、   \displaystyle \sum_{k=1}^N \min(A_k,B_k) を出力する。

制約

  •  1\le N,Q \le 2 \times 10^5
  •  1\le A_i,B_i \le 10^9
  •  1\le V_i \le 10^9
  • 入力される数値は全て整数

考察

クエリを処理するごとに sum を計算していては TLE になってしまう。

しかし、クエリごとに  A, B いずれか一か所の要素しか変更されないことに注目すると、 sum の差分を計算してその都度更新していくことができる。

実装例

#include <bits/stdc++.h>
using namespace std;

#define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++)

using ll = long long;

// ======================================== //

int main()
{
    int N, Q;
    cin >> N >> Q;
    vector<int> A(N), B(N);
    rep(i, 0, N) cin >> A[i];
    rep(i, 0, N) cin >> B[i];

    ll sum = 0;
    rep(i, 0, N) sum += min(A[i], B[i]);

    while (Q--)
    {
        char c;
        int X, V;
        cin >> c >> X >> V;
        X--;

        sum -= min(A[X], B[X]);

        if (c == 'A')
            A[X] = V;
        else
            B[X] = V;

        sum += min(A[X], B[X]);

        cout << sum << endl;
    }

    return 0;
}

atcoder.jp

実装時間: 5分

コメント

C問題久しぶりの4Q難易度。良心的だ。