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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
eijirou
September 11, 2026
Programming
150
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
1k
Fixstars高速化コンテスト2024準優勝解法
eijirou
0
420
Other Decks in Programming
See All in Programming
Java 27新機能 / Java 27 new features
kishida
2
190
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
100
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.3k
mrbgem 三角測量 開発
ogom
0
190
JRuby: Past, Present, and Future
headius
0
220
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
870
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
230
setup-vp GitLab対応の裏側
naokihaba
0
150
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
320
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
170
Simple Storage Service(S3) is not simple
iwatsukayura
0
120
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
190
Featured
See All Featured
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
700
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
420
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
390
4 Signs Your Business is Dying
shpigford
187
23k
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