Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
AHC070解法紹介
Search
eijirou
September 11, 2026
Programming
100
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
AHC070解法紹介
eijirou
September 11, 2026
More Decks by eijirou
See All by eijirou
AHC051解法紹介
eijirou
0
960
Fixstars高速化コンテスト2024準優勝解法
eijirou
0
400
Other Decks in Programming
See All in Programming
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
470
iOSDC2026登壇資料.pdf
riofujimon
0
120
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
240
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2k
XHTMLが残したもの
yosuke_furukawa
PRO
2
710
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
1.1k
What We Talk About When We Talk About XP
m_seki
2
560
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
120
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
280
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
110
自分的「カンファレンスの楽しみ方」
syumai
0
200
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Odyssey Design
rkendrick25
PRO
2
800
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Statistics for Hackers
jakevdp
799
230k
Code Reviewing Like a Champion
maltzj
528
40k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Documentation Writing (for coders)
carmenintech
77
5.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Done Done
chrislema
186
16k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Transcript
AtCoder Heuristic Contest 070 解法解説 祈祷の位置関係を固定した木上のビームサーチ / 指数減衰する未来コストの差分計算 2026-09-11 eijirou
目次 01. 解法の全体像 02. 祈祷の位置関係を固定する 03. 木上のビームサーチ 04. 評価関数 ①
確定コスト / ② 未来コスト 05. 評価関数 ③ 無駄移動ペナルティ / ④ 隣接マスボーナス 06. ハッシュによる重複除去 07. ビーム幅と複数方向の試行 08. まとめ AHC070 解説 1
解法の全体像 祈祷の 3 ベクトルは 固定 ── (22, 51), (61, 30),
(75, 65) ※ 内側の箱は外側の箱の中で動く 対称変換した 2 通り程度 を順に試し、最良を出力 木上のビームサーチ(深さ 10000 / 幅 W = 500) 評価値 = 確定コスト + 未来コスト + (1 − progress)² × (ペナルティ − ボーナス) ▪ 3 本のベクトル は固定し、1 万手の選択列 だけを探索する 記法:N = 100、M = 3、全 10000 ターン。ターン t の危険度増加 ct = floor( dt × √(t+1) ) dt = 怪異のマス (at, b t) から最も近い札までのマンハッタン距離(移動は mod N でループするが、距離はループしない) AHC070 解説 2
祈祷の位置関係を固定する ▪ 神力の通り道となる 3 本の移動ベクトル を事前に決め打ちす る – (22, 51),
(61, 30), (75, 65) ▪ ここを固定すれば、残りは 3 択を 1 万回選ぶだけ の問題 – 探索すべきものが手の選び方だけに減るので、同じ時間でより広く 探索できる ▪ 決め方 – まずは 勘 でそれっぽい 3 本を作る – そこから 実験しながら微調整(少し動かしてスコアを比較) – 最終的にこの 3 本に落ち着いた 移動は ((i + i m) mod N, (j + jm) mod N) AHC070 解説 3
木上のビームサーチ ▪ 深さ 10000 × 分岐 3 × 幅 500
→ 約 1500 万回 の評価を 1.95 秒に収める必要がある ▪ 状態を 遷移の木 として保持し、DFS で辿って 辺を降りるとき差分適用 / 戻るとき巻き戻し – 盤面のコピーが不要になり、評価も差分更新で済む ▪ 各深さで評価値上位 W = 500 個だけを残す(+ ハッシュで重複除去) AHC070 解説 4
評価関数の構成 評価値 = ① 確定コスト + ② 未来コスト + (1
− progress)² × ( ③ ペナルティ − ④ ボーナス ) (小さいほど良い) ① 確定コスト ② 未来コスト ③ 無駄移動ペナルティ ④ 隣接マスボーナス ターン t までに まだ押さえていない 無駄な 1 手に +40 隣接の空きマス 1 つに 10 すでに確定した危険度 未来の怪異(指数減衰) (1 − progress)² で減衰 (1 − progress)² で減衰 ▪ ① ② が「目的関数そのものの見積り」、③ ④ が「探索を良い形へ誘導するための補正」 ▪ ③ ④ は序盤にだけ強く効かせたいので、(1 − progress)² で減衰させる AHC070 解説 5
評価関数 ① 確定コスト ▪ ターン t までに すでに確定した危険度 の合計。目的関数の一部そのもの ▪
1 手進めるごとに、その手の危険度増加分を 足すだけ ▪ ただしこれだけでは先を見ていないので、② 未来コストと併せて使う AHC070 解説 6
評価関数 ② 未来コスト 和は「ターン i に怪異が起きるマスに、まだ札が立っていない i」について取る ▪ まだ札で押さえていない 未来の怪異
の危険度 √(i+1) を積む – 先回りして札を置けていれば d = 0 になるので、その項は消える – 遠い未来はこれから押さえる余地がある → γ = 0.9995 で割引 – 1386 ターン先で重みが 1/2 – 0.9995 は理論的な裏付けはなく、実験で調整して決めた値 ▪ 実装では逆に「押さえた分の和 B」を持ち、評価値から引く – 同じターンの状態同士を比べる分には 定数差なので等価 AHC070 解説 7
評価関数 ② 未来コストの差分計算 ▪ 指数減衰なので、B(押さえた分の和)の更新はすべて O(1) でできる 毎ターン、指数の肩を 1 つずらす
現ターンの怪異を d = 0 で処理できたとき(見込み分を回収) 未訪問マスに札を置き、そのマスの怪異が未来のターン i のとき ▪ 共通因子 γ で括り出せるので、総和を取り直す必要がない – 毎回 Σ を計算し直すと 1 遷移あたり O(N²) → 1500 万遷移には到底間に合わない ▪ 減衰を指数関数にしているのは、この差分計算のため AHC070 解説 8
評価関数 ③ 無駄移動ペナルティ ▪ 移動先が以下のマスのときにペナルティを与える – すでに 札が立っている マス →
札が増えず、1 ターン丸損 – すでに 怪異が発生した マス → その怪異には間に合わない ▪ どちらも「行っても嬉しくないマス」なので、ビームがそ こへ進むのを抑える ▪ ペナルティは 1 回 40。累積値に (1 − progress)² を掛けて 時 間減衰 – 序盤の無駄は強く嫌う – 終盤は避けようがないので、ほぼ効かせない AHC070 解説 9
評価関数 ④ 隣接マスボーナス ▪ 移動先の 隣接 4 マスのうち札がないマス 1 つあたり
10 のボーナス – 隣接は上下左右(盤面はループするので端では反対側と隣接) ▪ 札が薄い領域へビームを誘導する狙い(d を小さく保ちたい) ▪ ペナルティと同じ (1 − progress)² の重みで 時間減衰 AHC070 解説 10
ハッシュによる重複除去 ▪ ビーム内に実質同じ状態が並ぶのを防ぐため、状態をハッシュ で重複除去する ▪ 使ったキーは 現在の座標 (i, j) のみ
– 同じ深さ・同じ座標の状態は、評価値の良い方だけ残す ハッシュキー hash = N * i + j 同じ深さで同じマスにいる状態は 1 つだけ残す – 特にこだわりはなく、これで十分機能した(16 bit に収まる) AHC070 解説 11
ビーム幅と複数方向の試行 ▪ ビーム幅は W = 500 ▪ 祈祷の 3 本を対称変換したものを順に打ち、最良のものを出力
– そのまま → 反転 (N − i, N − j) → 転置 (j, i) → 転置+反転 – 1 回のビームで時間をかなり使うので、実際に打てるのは 2 通り程度 – 怪異の並びとの噛み合い方が変わるので、固定配置に対する保険になる AHC070 解説 12
まとめ ▪ 3 本のベクトル は固定し、1 万手の選択列 だけを木上のビームサーチで探索 – ベクトルは勘で作って実験で微調整 ▪
評価は 確定コスト + 未来コスト(指数減衰)+ (1 − progress)² × (罰 − 賞) – 未来分を 差分計算できる形(指数減衰) にしておくのが重要 ▪ 対称変換した 3 本を 2 通り程度 打ち、最良のものを出力 指数減衰 × 差分計算 で試行回数を稼ぎ、固定 × 対称変換 で入力によるばらつきを抑える AHC070 解説 13
おまけ:距離をトーラスで測っていた ▪ 実装では d を 上下左右がループする距離 で計算していた – 問題文には「この距離の計算では盤面の上下と左右はループしない」と明記されている –
注意書きまで用意されていたのに見落とした、完全に自分の不注意… ▪ ループなしに直して計算し直しても スコアはほぼ変わらなかった – 最序盤を除けば d は小さく、中盤以降はほとんど 0 か 1 で、端をまたぐ場面がほとんど無いからだと思われる AHC070 解説 14