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
スマート反転とウェブアクセシビリティ
camiha
0
200
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
360
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
150
Building an Out-of-Order CPU
latte72
1
760
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
140
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
XHTMLが残したもの
yosuke_furukawa
PRO
2
710
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
240
信頼性の目標を誰も求めてない
shubox
0
500
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
110
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
Featured
See All Featured
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
450
30 Presentation Tips
portentint
PRO
1
390
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
850
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
Google's AI Overviews - The New Search
badams
0
1.6k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
310
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
450
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
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