AtCoder Typical Components (β)

AtCoderのABC301以降のコンテスト(ABC, ARC, AGC)について、典型といえる部分を抜き出した記事になります。
立ち位置としては、1人で更新することで全ての問題について何かしら載っているAtCoder Tagsだと思っています。
投稿者の手動更新で、明確な判断基準があるわけではないので、あくまで参考程度にご使用ください。


1つ目の表の「問題」のリンクからは、AtCoderの問題のページに飛びます。
1つ目の表の「典型要素」のリンクからは、2つ目の表に飛びます。
2つ目の表の「問題」のリンクからは、1つ目の表に飛びます。



問題 典型要素
ABC301
ABC301 A - Overall Winner 【入門】
ABC301 B - Fill the Gaps 【入門】
ABC301 C - AtCoder Cards 【入門】 / 【文字列】
ABC301 D - Bitmask 【2進法・bit演算】 / 【貪欲法】
ABC301 E - Pac-Takahashi 【グラフ理論】 / 【動的計画法】 / 【探索法】 / bit DP / BFS
ABC301 F - Anti-DDoS 【文字列】 / 【動的計画法】 / 部分列DP
ABC301 G - Worst Picture 【幾何学】 / 3次元空間
ABC301 Ex - Difference of Distance 【グラフ理論】 / LowLink
ARC160
ARC160 A - Reverse and Count 【数え上げ・確率・期待値】 / 【操作】 / 【貪欲法】 / 順列の辞書順
ARC160 B - Triple Pair 【整数問題・素数】
ARC160 C - Power Up 【数え上げ・確率・期待値】 / 【動的計画法】 / 【典型データ構造】 / 累積和
ARC160 D - Mahjong 【数え上げ・確率・期待値】 / 【典型データ構造】 / 形式的冪級数
ARC160 E - Make Biconnected 【グラフ理論】 / LCA / オイラーツアー
ARC160 F - Count Sorted Arrays 【操作】 / 【動的計画法】
ABC302
ABC302 A - Attack 【入門】
ABC302 B - Find snuke 【入門】 / 【探索法】 / 全探索
ABC302 C - Almost Equal 【探索法】 / 順列全探索
ABC302 D - Impartial Gift 【探索法】 / 尺取り法 / 二分探索
ABC302 E - Isolation 【グラフ理論】
ABC302 F - Merge Set 【グラフ理論】 / BFS / 超頂点
ABC302 G - Sort from 1 to 4 【操作】 / 【数え上げ・確率・期待値】
ABC302 Ex - Ball Collector 【グラフ理論】 / 【典型データ構造】 / Undo可能Union-Find
AGC062
AGC062 A - Right Side Character 【操作】
AGC062 B - Split and Insert 【操作】 / 【動的計画法】 / 基数ソート / 区間DP
AGC062 C - Mex of Subset Sum 【数え上げ・確率・期待値】
AGC062 D - Walk Around Neighborhood 【幾何学】 / マンハッタン距離 / 三角不等式
AGC062 E - Overlap Binary Tree 【数え上げ・確率・期待値】 / 【グラフ理論】 / 【典型データ構造】 / 【動的計画法】 / 形式的冪級数 / 繰り返し二乗法 / NTT / FPS_POW
AGC062 F - Preserve Distinct 【操作】 / 【グラフ理論】 / Functional Graph
ABC303
ABC303 A - Similar String 【入門】
ABC303 B - Discord 【入門】
ABC303 C - Dash 【操作】
ABC303 D - Shift vs. CapsLock 【動的計画法】 / 耳DP
ABC303 E - A Gift From the Stars 【グラフ理論】 / DFS / BFS
ABC303 F - Damage over Time 【探索法】 / 二分探索
ABC303 G - Bags Game 【動的計画法】 / 【典型データ構造】 / セグメント木 / スライド最小値
ABC303 Ex - Constrained Tree Degree 【数え上げ・確率・期待値】 / 【グラフ理論】 / 【典型データ構造】 / ケイリーの定理 / 形式的冪級数 / 繰り返し二乗法 / NTT / FPS_POW
ARC161
ARC161 A - Make M 【貪欲法】
ARC161 B - Exactly Three Bits 【探索法】 / 全探索 / 二分探索
ARC161 C - Dyed by Majority (Odd Tree) 【構築】 / 【グラフ理論】
ARC161 D - Everywhere is Sparser than Whole (Construction) 【構築】 / 【グラフ理論】 / 誘導部分グラフ
ARC161 E - Not Dyed by Majority (Cubic Graph) 【構築】 / 【グラフ理論】 / 【乱択】 / 2-SAT
ARC161 F - Everywhere is Sparser than Whole (Judge) 【グラフ理論】 / 【ネットワークフロー】 / 頂点容量つき完全マッチング問題 / 強連結成分分解
ABC304
ABC304 A - First Player 【入門】
ABC304 B - Subscribers 【入門】
ABC304 C - Virus 【幾何学】 / 【グラフ理論】 / ユークリッド距離 / DFS / BFS / Union-Find
ABC304 D - A Piece of Cake 【探索法】 / 二分探索
ABC304 E - Good Graph 【グラフ理論】 / Union-Find
ABC304 F - Shift Table 【数え上げ・確率・期待値】 / 【整数問題・素数】 / メビウス関数
ABC304 G - Max of Medians 【2進法・bit演算】 / 【探索法】 / 二分探索
ABC304 Ex - Constrained Topological Sort 【グラフ理論】 / 【貪欲法】 / 【典型データ構造】 / 優先度つきキュー
ABC305
ABC305 A - Water Station 【入門】
ABC305 B - ABCDEFG 【入門】
ABC305 C - Snuke the Cookie Picker 【入門】 / 【探索法】 / 全探索
ABC305 D - Sleep Log 【典型データ構造】 / 【探索法】 / 累積和 / 二分探索
ABC305 E - Art Gallery on Graph 【グラフ理論】 / 【典型データ構造】 / 優先度つきキュー / セグメント木
ABC305 F - Dungeon Explore 【インタラクティブ】 / 【グラフ理論】 / DFS
ABC305 G - Banned Substrings 【数え上げ・確率・期待値】 / 【文字列】 / 【動的計画法】 / 行列累乗 / 繰り返し二乗法
ABC305 Ex - Shojin 【探索法】 / 【動的計画法】 / Monge性 / Alien DP / 三分探索
ABC306
ABC306 A - Echo 【入門】
ABC306 B - Base 2 【入門】
ABC306 C - Centers 【入門】
ABC306 D - Poisonous Full-Course 【動的計画法】 / 耳DP
ABC306 E - Best Performances 【典型データ構造】 / multiset
ABC306 F - Merge Sets 【数え上げ・確率・期待値】 / 【典型データ構造】 / BIT
ABC306 G - Return to 1 【グラフ理論】 / DFS
ABC306 Ex - Balance Scale 【数え上げ・確率・期待値】 / 【グラフ理論】 / 【動的計画法】 / bit DP / 包除原理
ARC162
ARC162 A - Ekiden Race 【数え上げ・確率・期待値】
ARC162 B - Insertion Sort 2 【構築】 / 【操作】 / 転倒数
ARC162 C - Mex Game on Tree 【ゲーム問題】 / MEX
ARC162 D - Smallest Vertices 【グラフ理論】 / 【数え上げ・確率・期待値】 / 【動的計画法】 / ケイリーの定理 / 主客転倒
ARC162 E - Strange Constraints 【数え上げ・確率・期待値】 / 【動的計画法】 / 二項係数・多項係数
ARC162 F - Montage 【数え上げ・確率・期待値】 / 【動的計画法】 / 二項係数・多項係数
ABC307
ABC307 A - Weekly Records 【入門】
ABC307 B - racecar 【入門】 / 【文字列】 / 回文
ABC307 C - Ideal Sheet 【探索法】 / 全探索
ABC307 D - Mismatched Parentheses 【探索法】 / 【文字列】
ABC307 E - Distinct Adjacent 【数え上げ・確率・期待値】 / 【動的計画法】 / 耳DP
ABC307 F - Virus 2 【グラフ理論】 / 【典型データ構造】 / ダイクストラ法 / 優先度つきキュー
ABC307 G - Approximate Equalization 【操作】 / 【動的計画法】
ABC307 Ex - Marquee 【数え上げ・確率・期待値】 / 【文字列】 / 【典型データ構造】 / NTT
ABC308
ABC308 A - New Scheme 【入門】
ABC308 B - Default Price 【入門】
ABC308 C - Standings 【典型データ構造】 / 安定ソート
ABC308 D - Snuke Maze 【グラフ理論】 / DFS / BFS
ABC308 E - MEX 【数え上げ・確率・期待値】 / 【典型データ構造】 / 累積和
ABC308 F - Vouchers 【貪欲法】 / 【典型データ構造】 / 優先度つきキュー
ABC308 G - Minimum Xor Pair Query 【2進法・bit演算】
ABC308 Ex - Make Q 【グラフ理論】
ARC163
ARC163 A - Divide String 【文字列】 / 【探索法】 / 辞書順 / 全探索
ARC163 B - Favorite Game 【操作】 / 【探索法】 / 全探索
ARC163 C - Harmonic Mean 【構築】 / 【操作】 / 単位分数分解
ARC163 D - Sum of SCC 【グラフ理論】 / 【数え上げ・確率・期待値】 / 【動的計画法】
ARC163 E - Chmin XOR Game 【ゲーム問題】 / 【2進法・bit演算】
ARC163 F - Many Increasing Problems 【数え上げ・確率・期待値】 / 【操作】 / 【典型データ構造】 / カタラン数 / slope trick
ABC309
ABC309 A - Nine 【入門】
ABC309 B - Rotate 【入門】
ABC309 C - Medicine 【入門】 / 【探索法】 / イベントソート
ABC309 D - Add One Edge 【グラフ理論】 / DFS / BFS
ABC309 E - Family and Insurance 【グラフ理論】 / 【動的計画法】
ABC309 F - Box in Box 【典型データ構造】 / セグメント木
ABC309 G - Ban Permutation 【数え上げ・確率・期待値】 / 【動的計画法】 / 包除原理 / 箱根駅伝DP
ABC309 Ex - Simple Path Counting Problem 【数え上げ・確率・期待値】 / 【典型データ構造】 / 鏡像法 / 形式的冪級数 / 繰り返し二乗法
ARC164
ARC164 A - Ternary Decomposition 【操作】
ARC164 B - Switching Travel 【グラフ理論】 / Union-Find
ARC164 C - Reversible Card Game 【ゲーム問題】 / 【貪欲法】
ARC164 D - 1D Coulomb 【数え上げ・確率・期待値】 / 【動的計画法】
ARC164 E - Segment-Tree Optimization 【グラフ理論】 / 【動的計画法】 / 完全二分木
ARC164 F - Subtree Reversi 【ゲーム問題】 / 【グラフ理論】
ABC310
ABC310 A - Order Something Else 【入門】
ABC310 B - Strictly Superior 【入門】 / 【探索法】 / 全探索
ABC310 C - Reversible 【入門】 / 【文字列】
ABC310 D - Peaceful Teams 【数え上げ・確率・期待値】 / 【探索法】 / 【グラフ理論】 / DFS
ABC310 E - NAND repeatedly 【2進法・bit演算】
ABC310 F - Make 10 Again 【数え上げ・確率・期待値】 / 【動的計画法】 / bit DP
ABC310 G - Takahashi And Pass-The-Ball Game 【数え上げ・確率・期待値】 / 【グラフ理論】 / ダブリング / Functional Graph
ABC310 Ex - Negative Cost 【動的計画法】 / 個数制限なしナップサック問題
ABC311
ABC311 A - First ABC 【入門】
ABC311 B - Vacation Together 【入門】
ABC311 C - Find it! 【グラフ理論】 / Functional Graph
ABC311 D - Grid Ice Floor 【探索法】 / 【グラフ理論】 / DFS / BFS
ABC311 E - Defect-free Squares 【動的計画法】
ABC311 F - Yet Another Grid Task 【動的計画法】 / 【典型データ構造】 / 累積和
ABC311 G - One More Grid Task 【探索法】 / ヒストグラム内最大長方形
ABC311 Ex - Many Illumination Plans 【グラフ理論】 / 【動的計画法】 / 重軽再帰DP
ABC312
ABC312 A - Chord 【入門】
ABC312 B - TaK Code 【入門】
ABC312 C - Invisible Hand 【探索法】 / 二分探索
ABC312 D - Count Bracket Sequences 【動的計画法】 / 耳DP
ABC312 E - Tangency of Cuboids 【幾何学】 / 【探索法】 / 3次元空間 / 全探索
ABC312 F - Cans and Openers 【貪欲法】
ABC312 G - Avoid Straight Line 【グラフ理論】 / 【数え上げ・確率・期待値】 / 【動的計画法】 / 木DP
ABC312 Ex - snukesnuke 【文字列】 / Z-algorithm
AGC063
AGC063 A - Mex Game 【ゲーム問題】 / MEX
AGC063 B - Insert 1, 2, 3, ... 【数え上げ・確率・期待値】 / 【動的計画法】
AGC063 C - Add Mod Operations 【構築】 / 【操作】
AGC063 D - Many CRT 【整数問題・素数】 / エラトステネスの篩
AGC063 E - Child to Parent 【数え上げ・確率・期待値】 / 【グラフ理論】 / 【動的計画法】 / 【典型データ構造】 / 木DP / 形式的冪級数
AGC063 F - Simultaneous Floor 【操作】
ABC313
ABC313 A - To Be Saikyo 【入門】
ABC313 B - Who is Saikyo? 【入門】
ABC313 C - Approximate Equalization 2 【操作】
ABC313 D - Odd or Even 【インタラクティブ】 / 【2進法・bit演算】
ABC313 E - Duplicate 【操作】 / ランレングス圧縮
ABC313 F - Flip Machines 【数え上げ・確率・期待値】 / 【探索法】 / 【動的計画法】 / 全探索 / bit DP
ABC313 G - Redistribution of Piles 【数え上げ・確率・期待値】 / 【操作】 / 【整数問題・素数】 / floor sum
ABC313 Ex - Group Photo 【数え上げ・確率・期待値】 / 【動的計画法】 / 挿入DP
ABC314
ABC314 A - 3.14 【入門】
ABC314 B - Roulette 【入門】
ABC314 C - Rotate Colored Subsequence 【入門】 / 【文字列】 / 巡回シフト
ABC314 D - LOWER 【文字列】
ABC314 E - Roulettes 【数え上げ・確率・期待値】 / 【動的計画法】 / 期待値DP
ABC314 F - A Certain Game 【数え上げ・確率・期待値】 / 【グラフ理論】 / Union-Find / DFS
ABC314 G - Amulets 【操作】 / 【探索法】 / 二分探索
ABC314 Ex - Disk and Segments 【幾何学】 / 【探索法】 / 三分探索
AGC064
AGC064 A - i i's 【構築】
AGC064 B - Red and Blue Spanning Tree 【構築】 / 【グラフ理論】 / プリム法
AGC064 C - Erase and Divide Game 【ゲーム問題】 / 【数え上げ・確率・期待値】 / 【典型データ構造】 / ダブリング / 座標圧縮
AGC064 D - Red and Blue Chips 【数え上げ・確率・期待値】 / 【動的計画法】 / 【文字列】
AGC064 E - Cross Sum Construction 【構築】
AGC064 F - No Permutations 【数え上げ・確率・期待値】 / 【典型データ構造】 / 【探索法】 / 包除原理 / 形式的冪級数 / 分割統治法 / NTT
ABC315
ABC315 A - tcdr 【入門】
ABC315 B - The Middle Day 【入門】
ABC315 C - Flavors 【入門】
ABC315 D - Magical Cookies 【文字列】 / 【操作】
ABC315 E - Prerequisites 【グラフ理論】 / トポロジカルソート / BFS
ABC315 F - Shortcuts 【動的計画法】
ABC315 G - Ai + Bj + Ck = X (1 <= i, j, k <= N) 【探索法】 / 【整数問題・素数】 / 全探索 / 拡張ユークリッドの互除法
ABC315 Ex - Typical Convolution Problem 【典型データ構造】 / 形式的冪級数 / Relaxed Convolution / 累積和
ABC317
ABC317 A - Potions 【入門】
ABC317 B - MissingNo. 【入門】
ABC317 C - Remembering the Days 【グラフ理論】 / DFS
ABC317 D - President 【動的計画法】 / ナップサック問題
ABC317 E - Avoid Eye Contact 【グラフ理論】 / BFS
ABC317 F - Nim 【動的計画法】 / 桁DP
ABC317 G - Rearranging 【ネットワークフロー】 / 完全マッチング問題
ABC317 Ex - Walk 【動的計画法】 / 【典型データ構造】 / 【数え上げ・確率・期待値】 / 【探索法】 / 形式的冪級数 / 行列積 / 分割統治法
ABC318
ABC318 A - Full Moon 【入門】
ABC318 B - Overlapping sheets 【入門】
ABC318 C - Blue Spring 【典型データ構造】 / 累積和
ABC318 D - General Weighted Max Matching 【動的計画法】 / bit DP
ABC318 E - Sandwiches 【数え上げ・確率・期待値】 / 【探索法】 / 全探索
ABC318 F - Octopus 【数え上げ・確率・期待値】
ABC318 G - Typical Path Problem 【グラフ理論】 / 【ネットワークフロー】
ABC318 Ex - Count Strong Test Cases 【グラフ理論】 / 【典型データ構造】 / 形式的冪級数 / 指数型母関数 / ニュートン法
ABC319
ABC319 A - Legendary Players 【入門】
ABC319 B - Measure 【入門】
ABC319 C - False Hope 【数え上げ・確率・期待値】 / 【探索法】 / 順列全探索
ABC319 D - Minimum Width 【探索法】 / 二分探索
ABC319 E - Bus Stops 【探索法】 / 全探索
ABC319 F - Fighter Takahashi 【貪欲法】 / 【動的計画法】 / bit DP
ABC319 G - Counting Shortest Paths 【グラフ理論】 / 【動的計画法】 / BFS
ABC320
ABC320 A - Leyland Number 【入門】
ABC320 B - Longest Palindrome 【入門】 / 【文字列】 / 回文
ABC320 C - Slot Strategy 2 (Easy) 【探索法】 / 全探索
ABC320 D - Relative Position 【グラフ理論】 / DFS / BFS
ABC320 E - Somen Nagashi 【典型データ構造】 / 優先度つきキュー
ABC320 F - Fuel Round Trip 【動的計画法】 / 耳DP
ABC320 G - Slot Strategy 2 (Hard) 【ネットワークフロー】 / 【探索法】 / マッチング問題 / 二分探索
ARC165
ARC165 A - Sum equals LCM 【整数問題・素数】
ARC165 B - Sliding Window Sort 2 【操作】 / 順列の辞書順
ARC165 C - Social Distance on Graph 【グラフ理論】 / DFS / 二部グラフ
ARC165 D - Substring Comparison 【文字列】 / 【グラフ理論】 / 辞書順 / トポロジカルソート
ARC165 E - Random Isolation 【数え上げ・確率・期待値】 / 【グラフ理論】 / 【動的計画法】 / 木DP / 2乗の木DP
ARC165 F - Make Adjacent 【操作】 / 【典型データ構造】 / 優先度つきキュー / セグメント木
ABC321
ABC321 A - 321-like Checker 【入門】
ABC321 B - Cutoff 【入門】 / 【探索法】 / 全探索
ABC321 C - 321-like Searcher 【探索法】 / bit全探索
ABC321 D - Set Menu 【探索法】 / 【典型データ構造】 / 二分探索 / 尺取り法 / 累積和
ABC321 E - Complete Binary Tree 【グラフ理論】 / 完全二分木
ABC321 F - #(subset sum = K) with Add and Erase 【動的計画法】 / 部分和問題 / 戻すDP
ABC321 G - Electric Circuit 【数え上げ・確率・期待値】 / 【グラフ理論】 / 【動的計画法】 / 主客転倒 / 部分集合列挙 bit DP
ABC322
ABC322 A - First ABC 2 【入門】
ABC322 B - Prefix and Suffix 【入門】
ABC322 C - Festival 【入門】 / 【探索法】 / 二分探索 / 全探索
ABC322 D - Polyomino 【探索法】 / 【幾何学】 / 全探索 / グリッドの回転
ABC322 E - Product Development 【動的計画法】 / ナップサック問題
ABC322 F - Vacation Query 【典型データ構造】 / 遅延評価セグメント木
ABC322 G - Two Kinds of Base 【数え上げ・確率・期待値】 / 【整数問題・素数】
ABC323
ABC323 A - Weak Beats 【入門】
ABC323 B - Round-Robin Tournament 【入門】
ABC323 C - World Tour Finals 【入門】 / 【探索法】
ABC323 D - Merge Slimes 【2進法・bit演算】
ABC323 E - Playlist 【数え上げ・確率・期待値】 / 【動的計画法】 / 【典型データ構造】 / 累積和
ABC323 F - Push and Carry 【幾何学】 / グリッドの回転
ABC323 G - Inversion of Tree 【数え上げ・確率・期待値】 / 【グラフ理論】 / 行列木定理 / 固有多項式 / 1次の多項式行列の行列式
ARC166
ARC166 A - Replace C or Swap AB 【文字列】 / 【操作】
ARC166 B - Make Multiples 【整数問題・素数】 / 【動的計画法】 / bit DP
ARC166 C - LU / RD Marking 【数え上げ・確率・期待値】
ARC166 D - Interval Counts 【探索法】 / 二分探索
ARC166 E - Fizz Buzz Difference 【整数問題・素数】 / floor sum / 最良近似分数
ARC166 F - Tangent Addition Formula 【整数問題・素数】 / 関数方程式 / ガウス整数
ABC324
ABC324 A - Same 【入門】
ABC324 B - 3-smooth Numbers 【入門】
ABC324 C - Error Correction 【文字列】
ABC324 D - Square Permutation 【整数問題・素数】 / 【探索法】 / 平方数 / 全探索
ABC324 E - Joint Two Strings 【数え上げ・確率・期待値】 / 【文字列】 / 【典型データ構造】 / 累積和
ABC324 F - Beautiful Path 【グラフ理論】 / 【探索法】 / 【動的計画法】 / 二分探索 / 食塩水
ABC324 G - Generate Arrays 【典型データ構造】
ARC167
ARC167 A - Toasts for Breakfast Party 【貪欲法】
ARC167 B - Product of Divisors 【整数問題・素数】 / 正の約数の総積
ARC167 C - MST on Line++ 【グラフ理論】 / 【数え上げ・確率・期待値】 / 最小全域木
ARC167 D - Good Permutation 【操作】 / 【グラフ理論】 / 順列の辞書順 / Union-Find
ARC167 E - One Square in a Triangle 【構築】 / 【幾何学】
ARC167 F - Tree Tree Tree 【グラフ理論】 / 【典型データ構造】 / 【数え上げ・確率・期待値】 / 【探索法】 / 形式的冪級数 / 分割統治法 / NTT
ABC325
ABC325 A - Takahashi san 【入門】
ABC325 B - World Meeting 【入門】 / 【探索法】 / 全探索
ABC325 C - Sensors 【グラフ理論】 / DFS / BFS / Union-Find
ABC325 D - Printing Machine 【貪欲法】 / 【探索法】 / 【典型データ構造】 / 二分探索 / 尺取り法 / 優先度つきキュー
ABC325 E - Our clients, please wait a moment 【グラフ理論】 / ダイクストラ法
ABC325 F - Sensor Optimization Dilemma 【動的計画法】
ABC325 G - offence 【文字列】 / 【動的計画法】
ABC326
ABC326 A - 2UP3DOWN 【入門】
ABC326 B - 326-like Numbers 【入門】 / 【探索法】 / 全探索
ABC326 C - Peak 【入門】 / 【探索法】 / 二分探索 / 尺取り法
ABC326 D - ABC Puzzle 【文字列】 / 【探索法】 / 全探索
ABC326 E - Revenge of "The Salary of AtCoder Inc." 【数え上げ・確率・期待値】 / 【典型データ構造】 / 累積和
ABC326 F - Robot Rotation 【構築】 / 【探索法】 / 半分全列挙 / 二分探索
ABC326 G - Unlock Achievement 【ネットワークフロー】 / 最大流問題 / 最小カット問題
ABC327
ABC327 A - ab 【入門】
ABC327 B - A^A 【入門】 / 【探索法】 / 全探索
ABC327 C - Number Place 【入門】 / 【探索法】 / 全探索
ABC327 D - Good Tuple Problem 【グラフ理論】 / 二部グラフ
ABC327 E - Maximize Rating 【動的計画法】
ABC327 F - Apples 【探索法】 / 【典型データ構造】 / 平面走査 / 遅延評価セグメント木
ABC327 G - Many Good Tuple Problems 【数え上げ・確率・期待値】 / 【グラフ理論】 / 【動的計画法】 / 除原理
ABC328
ABC328 A - Not Too Hard 【入門】
ABC328 B - 11/11 【入門】 / 【探索法】 / 全探索
ABC328 C - Consecutive 【入門】 / 【典型データ構造】 / 累積和
ABC328 D - Take ABC 【文字列】 / 【貪欲法】
ABC328 E - Modulo MST 【グラフ理論】 / 【探索法】 / 全域木 / 全探索 / Union-Find
ABC328 F - Good Set Query 【グラフ理論】 / 重みつきUnion-Find
ABC328 G - Cut and Reorder 【操作】 / 【動的計画法】 / bit DP
ABC329
ABC329 A - Spread 【入門】
ABC329 B - Next 【入門】
ABC329 C - Count xxx 【入門】 / 【操作】 / ランレングス圧縮
ABC329 D - Election Quick Report 【入門】
ABC329 E - Stamp 【文字列】 / 【操作】 / 【貪欲法】 / 逆順に見る
ABC329 F - Colored Ball 【操作】 / Weighted-Union Heuristic(マージテク)
ABC329 G - Delivery on Tree 【数え上げ・確率・期待値】 / 【操作】 / 【グラフ理論】 / 【動的計画法】 / 【探索法】 / メモ化再帰 / 順列全探索
ARC168
ARC168 A - <Inversion> 【操作】 / 転倒数
ARC168 B - Arbitrary Nim 【ゲーム問題】 / 【2進法・bit演算】 / ニム / Grundy数
ARC168 C - Swap Characters 【数え上げ・確率・期待値】 / 【操作】 / 【文字列】 / 【探索法】 / 二項係数・多項係数 / 全探索
ARC168 D - Maximize Update 【操作】 / 【動的計画法】 / 【典型データ構造】 / 区間DP / 累積和
ARC168 E - Subsegments with Large Sums 【動的計画法】 / Alien DP
ARC168 F - Up-Down Queries 【操作】 / 【ネットワークフロー】 / 【典型データ構造】 / 最小費用流問題 / セグメント木
ABC330
ABC330 A - Counting Passes 【入門】
ABC330 B - Minimize Abs 1 【入門】
ABC330 C - Minimize Abs 2 【探索法】 / 全探索
ABC330 D - Counting Ls 【数え上げ・確率・期待値】
ABC330 E - Mex and Update 【典型データ構造】 / MEXのクエリの処理
ABC330 F - Minimize Bounding Square 【貪欲法】
ABC330 G - Inversion Squared 【数え上げ・確率・期待値】 / 【操作】 / 積の和典型 / 転倒数
ABC331
ABC331 A - Tomorrow 【入門】
ABC331 B - Buy One Carton of Milk 【入門】 / 【探索法】 / 全探索
ABC331 C - Sum of Numbers Greater Than Me 【典型データ構造】 / 累積和
ABC331 D - Tile Pattern 【典型データ構造】 / 2次元累積和
ABC331 E - Set Meal 【探索法】 / 【典型データ構造】 / 優先度つきキュー
ABC331 F - Palindrome Query 【文字列】 / 【典型データ構造】 / 回文 / ローリングハッシュ / セグメント木
ABC331 G - Collect Them All 【数え上げ・確率・期待値】 / 【操作】 / 【典型データ構造】 / 形式的冪級数 / 包除原理 / FFTマージテク / マルコフ連鎖 / 吸収マルコフ連鎖
ARC169
ARC169 A - Please Sign 【操作】 / 【グラフ理論】
ARC169 B - Subsegments with Small Sums 【数え上げ・確率・期待値】 / 【動的計画法】 / 【貪欲法】
ARC169 C - Not So Consecutive 【数え上げ・確率・期待値】 / 【動的計画法】 / 【典型データ構造】 / 累積和
ARC169 D - Add to Make a Permutation 【操作】
ARC169 E - Avoid Boring Matches 【操作】 / 【貪欲法】 / 【典型データ構造】 / 累積和
ARC169 F - Large DP Table 【数え上げ・確率・期待値】 / 【動的計画法】 / 【グラフ理論】 / カルテシアン木
ABC332
ABC332 A - Online Shopping 【入門】
ABC332 B - Glass and Mug 【入門】
ABC332 C - T-shirts 【入門】 / 【探索法】 / 全探索
ABC332 D - Swapping Puzzle 【操作】 / 【探索法】 / 順列全探索 / 転倒数
ABC332 E - Lucky bag 【動的計画法】 / 部分集合列挙 bit DP
ABC332 F - Random Update Query 【数え上げ・確率・期待値】 / 【典型データ構造】 / 遅延評価セグメント木
ABC332 G - Not Too Many Balls 【ネットワークフロー】 / 【動的計画法】 / 最大流問題 / 最小カット問題
ABC333
ABC333 A - Three Threes 【入門】
ABC333 B - Pentagon 【入門】
ABC333 C - Repunit Trio 【入門】 / 【探索法】 / 全探索
ABC333 D - Erase Leaves 【グラフ理論】 / Union-Find
ABC333 E - Takahashi Quest 【貪欲法】 / 【典型データ構造】 / imos法
ABC333 F - Bomb Game 2 【数え上げ・確率・期待値】 / 【動的計画法】
ABC333 G - Nearest Fraction 【整数問題・素数】 / 最良近似分数 / シュターン・ブロコ木 / 連分数展開
AGC065
AGC065 A - Shuffle and mod K 【整数問題・素数】
AGC065 B - Erase and Insert 【数え上げ・確率・期待値】 / 【操作】 / 【動的計画法】 / 【典型データ構造】 / 累積和
AGC065 C - Avoid Half Sum 【整数問題・素数】
AGC065 D - Not Intersect 【数え上げ・確率・期待値】 / 【典型データ構造】 / 形式的冪級数
AGC065 E - One Two Three 【操作】 / 【典型データ構造】 / 転倒数 / Convex Hull Trick
AGC065 F - Always Perfect 【数え上げ・確率・期待値】 / 【グラフ理論】 / 全域木 / 完全マッチング / 二重頂点連結成分分解 / プリューファーコード
ABC334
ABC334 A - Christmas Present 【入門】
ABC334 B - Christmas Trees 【整数問題・素数】 / 負の数の切り捨て除算
ABC334 C - Socks 2 【典型データ構造】 / 累積和
ABC334 D - Reindeer and Sleigh 【典型データ構造】 / 【探索法】 / 累積和 / 二分探索
ABC334 E - Christmas Color Grid 1 【数え上げ・確率・期待値】 / 【グラフ理論】 / BFS / DFS / Union-Find
ABC334 F - Christmas Present 2 【動的計画法】 / 【典型データ構造】 / セグメント木 / スライド最小値
ABC334 G - Christmas Color Grid 2 【数え上げ・確率・期待値】 / 【グラフ理論】 / LowLink
ABC335
ABC335 A - 202<s>3</s> 【入門】
ABC335 B - Tetrahedral Number 【入門】
ABC335 C - Loong Tracking 【典型データ構造】
ABC335 D - Loong and Takahashi 【構築】
ABC335 E - Non-Decreasing Colorful Path 【グラフ理論】 / 【動的計画法】 / 最長経路問題 / Union-Find
ABC335 F - Hop Sugoroku 【数え上げ・確率・期待値】 / 【動的計画法】 / 【典型データ構造】 / 平方分割
ABC335 G - Discrete Logarithm Problems 【数え上げ・確率・期待値】 / 【整数問題・素数】 / 位数
ABC336
ABC336 A - Long Loong 【入門】
ABC336 B - CTZ 【入門】
ABC336 C - Even Digits 【入門】 / 【整数問題・素数】 / 基数変換
ABC336 D - Pyramid 【動的計画法】
ABC336 E - Digit Sum Divisible 【動的計画法】 / 【整数問題・素数】 / 桁DP
ABC336 F - Rotation Puzzle 【探索法】 / 半分全列挙
ABC336 G - 16 Integers 【数え上げ・確率・期待値】 / 【文字列】 / 【グラフ理論】 / de Bruijn列 / オイラー路 / BEST定理 / 有向行列木定理
ABC337
ABC337 A - Scoreboard 【入門】
ABC337 B - Extended ABC 【入門】
ABC337 C - Lining Up 2 【入門】 / 【グラフ理論】
ABC337 D - Cheating Gomoku Narabe 【探索法】 / 【典型データ構造】 / 全探索 / 累積和
ABC337 E - Bad Juice 【インタラクティブ】
ABC337 F - Usual Color Ball Problems 【数え上げ・確率・期待値】 / 【操作】 / 【探索法】 / 尺取り法
ABC337 G - Tree Inversion 【数え上げ・確率・期待値】 / 【グラフ理論】 / 【典型データ構造】 / 【探索法】 / BIT / セグメント木 / 平面走査 / imos法 / オイラーツアー
ARC170
ARC170 A - Yet Another AB Problem 【操作】 / 【文字列】 / 【貪欲法】 / 括弧列
ARC170 B - Arithmetic Progression Subsequence 【数え上げ・確率・期待値】 / 鳩の巣原理
ARC170 C - Prefix Mex Sequence 【数え上げ・確率・期待値】 / 【ゲーム問題】 / 【動的計画法】 / MEX
ARC170 D - Triangle Card Game 【ゲーム問題】 / 【幾何学】 / 三角不等式 / 三角形の成立条件
ARC170 E - BDFS 【数え上げ・確率・期待値】 / 【操作】 / 【グラフ理論】 / 【動的計画法】 / 行列累乗
ARC170 F - Edge Deletion 2 【操作】 / 【グラフ理論】 / 【貪欲法】 / 順列の辞書順
ABC338
ABC338 A - Capitalized? 【入門】
ABC338 B - Frequency 【入門】
ABC338 C - Leftover Recipes 【探索法】 / 全探索
ABC338 D - Island Tour 【グラフ理論】 / 【典型データ構造】 / imos法
ABC338 E - Chords 【幾何学】 / 凸図形上の2点を端点とする線分どうしの交差
ABC338 F - Negative Traveling Salesman 【グラフ理論】 / 【動的計画法】 / ワーシャル・フロイド法 / bit DP
ABC338 G - evall 【数え上げ・確率・期待値】
ABC339
ABC339 A - TLD 【入門】
ABC339 B - Langton's Takahashi 【入門】
ABC339 C - Perfect Bus 【入門】 / 【典型データ構造】 / 累積和
ABC339 D - Synchronized Players 【グラフ理論】 / BFS
ABC339 E - Smooth Subsequence 【動的計画法】 / 【典型データ構造】 / セグメント木
ABC339 F - Product Equality 【数え上げ・確率・期待値】 / 【整数問題・素数】 / 【乱択】
ABC339 G - Smaller Sum 【典型データ構造】 / マージソート木
ARC171
ARC171 A - No Attacking 【操作】
ARC171 B - Chmax 【数え上げ・確率・期待値】 / 【操作】 / 【グラフ理論】
ARC171 C - Swap on Tree 【数え上げ・確率・期待値】 / 【操作】 / 【グラフ理論】 / 【動的計画法】 / 全域部分グラフ / 2乗の木DP
ARC171 D - Rolling Hash 【整数問題・素数】 / 【動的計画法】 / 【グラフ理論】 / 部分集合列挙 bit DP / 頂点彩色
ARC171 E - Rookhopper's Tour 【数え上げ・確率・期待値】 / 【操作】
ARC171 F - Both Reversible 【数え上げ・確率・期待値】 / 【文字列】 / 包除原理
ABC340
ABC340 A - Arithmetic Progression 【入門】
ABC340 B - Append 【入門】
ABC340 C - Divide and Divide 【整数問題・素数】 / 【動的計画法】 / メモ化再帰
ABC340 D - Super Takahashi Bros. 【グラフ理論】 / ダイクストラ法
ABC340 E - Mancala 2 【操作】 / 【典型データ構造】 / 遅延評価セグメント木
ABC340 F - S = 1 【幾何学】 / 【整数問題・素数】 / 拡張ユークリッドの互除法
ABC340 G - Leaf Color 【グラフ理論】 / 【数え上げ・確率・期待値】 / 【動的計画法】 / 木DP / Auxiliary Tree
ABC341
ABC341 A - Print 341 【入門】
ABC341 B - Foreign Exchange 【入門】 / 【貪欲法】
ABC341 C - Takahashi Gets Lost 【探索法】 / 全探索
ABC341 D - Only one of two 【整数問題・素数】 / 【探索法】 / 二分探索
ABC341 E - Alternating String 【操作】 / 【典型データ構造】 / セグメント木
ABC341 F - Breakdown 【操作】 / 【グラフ理論】 / 【動的計画法】 / ナップサック問題
ABC341 G - Highest Ratio 【幾何学】 / 凸包 / グラハムスキャン
ARC172
ARC172 A - Chocolate 【貪欲法】
ARC172 B - AtCoder Language 【数え上げ・確率・期待値】 / 【文字列】
ARC172 C - Election 【数え上げ・確率・期待値】
ARC172 D - Distance Ranking 【構築】 / 【幾何学】 / ユークリッド距離
ARC172 E - Last 9 Digits 【整数問題・素数】 / 【探索法】 / 全探索 / カーマイケルの定理
ARC172 F - Walking 【操作】 / 【文字列】 / 【動的計画法】 / 編集距離
ABC342
ABC342 A - Yay! 【入門】
ABC342 B - Which is ahead? 【入門】
ABC342 C - Many Replacement 【文字列】
ABC342 D - Square Pair 【整数問題・素数】 / 平方数
ABC342 E - Last Train 【グラフ理論】 / ダイクストラ法
ABC342 F - Black Jack 【数え上げ・確率・期待値】 / 【動的計画法】 / 【典型データ構造】 / 累積和 / imos法
ABC342 G - Retroactive Range Chmax 【操作】 / 【典型データ構造】 / セグメント木 / multiset
ABC343
ABC343 A - Wrong Answer 【入門】
ABC343 B - Adjacency Matrix 【入門】
ABC343 C - 343 【入門】 / 【探索法】 / 【整数問題・素数】 / 全探索
ABC343 D - Diversity of Scores 【典型データ構造】
ABC343 E - 7x7x7 【幾何学】 / 【探索法】 / 【数え上げ・確率・期待値】 / 3次元空間 / 全探索 / 包除原理
ABC343 F - Second Largest Query 【典型データ構造】 / セグメント木
ABC343 G - Compress Strings 【文字列】 / 【動的計画法】 / Z-algorithm / ローリングハッシュ / bit DP
ABC344
ABC344 A - Spoiler 【入門】
ABC344 B - Delimiter 【入門】
ABC344 C - A+B+C 【入門】 / 【探索法】 / 【典型データ構造】 / 全探索
ABC344 D - String Bags 【文字列】 / 【動的計画法】
ABC344 E - Insert or Erase 【操作】 / 【典型データ構造】 / 双方向連結リスト
ABC344 F - Earn to Advance 【動的計画法】
ABC344 G - Points and Comparison 【数え上げ・確率・期待値】 / 【探索法】 / 【操作】 / 【典型データ構造】 / 二分探索 / バブルソート / 優先度つきキュー
ARC173
ARC173 A - Neq Number 【数え上げ・確率・期待値】 / 【探索法】 / 二分探索
ARC173 B - Make Many Triangles 【幾何学】
ARC173 C - Not Median 【探索法】
ARC173 D - Bracket Walk 【グラフ理論】 / 【文字列】 / 括弧列 / ベルマン・フォード法
ARC173 E - Rearrange and Adjacent XOR 【操作】 / 【2進法・bit演算】 / 部分集合のXORの最大値 / chmin掃き出し法(noshi基底)
ARC173 F - Select and Split 【数え上げ・確率・期待値】 / 【操作】 / 【グラフ理論】 / 【典型データ構造】 / 形式的冪級数 / 行列木定理
ABC345
ABC345 A - Leftrightarrow 【入門】
ABC345 B - Integer Division Returns 【入門】
ABC345 C - One Time Swap 【操作】 / 【文字列】 / 【探索法】 / 全探索
ABC345 D - Tiling 【探索法】 / 順列全探索 / bit全探索
ABC345 E - Colorful Subsequence 【動的計画法】
ABC345 F - Many Lamps 【操作】 / 【2進法・bit演算】 / 【グラフ理論】 / DFS / 全域木
ABC345 G - Sugoroku 5 【数え上げ・確率・期待値】 / 【典型データ構造】 / 【探索法】 / 形式的冪級数 / NTT / 分割統治法 / 分割統治FFT / ニュートン法 / ラグランジュの反転公式
ARC174
ARC174 A - A Multiply 【操作】 / 【動的計画法】 / 【典型データ構造】 / 最大部分配列問題 / Kadane's Algorithm / 累積和
ARC174 B - Bought Review 【操作】 / 【整数問題・素数】
ARC174 C - Catastrophic Roulette 【数え上げ・確率・期待値】 / 【動的計画法】 / 期待値DP
ARC174 D - Digit vs Square Root 【整数問題・素数】 / 【探索法】
ARC174 E - Existence Counting 【数え上げ・確率・期待値】 / 【文字列】 / 【典型データ構造】 / 辞書順 / 二項係数・多項係数 / 遅延評価セグメント木
ARC174 F - Final Stage 【ゲーム問題】 / 【典型データ構造】 / 後退解析 / 優先度つきキュー / 双方向連結リスト
ABC346
ABC346 A - Adjacent Product 【入門】
ABC346 B - Piano 【入門】 / 【文字列】 / 【探索法】 / 全探索
ABC346 C - Σ 【入門】 / 【典型データ構造】
ABC346 D - Gomamayo Sequence 【探索法】 / 【文字列】 / 【典型データ構造】 / 全探索 / 累積和
ABC346 E - Paint 【操作】 / 【数え上げ・確率・期待値】 / 逆順に見る
ABC346 F - SSttrriinngg in StringString 【文字列】 / 【探索法】 / 二分探索
ABC346 G - Alone 【数え上げ・確率・期待値】 / 【典型データ構造】 / 【探索法】 / 遅延評価セグメント木 / 平面走査
ARC175
ARC175 A - Spoon Taking Problem 【数え上げ・確率・期待値】
ARC175 B - Parenthesis Arrangement 【操作】 / 【文字列】 / 括弧列
ARC175 C - Jumping Through Intervals 【文字列】 / 辞書順
ARC175 D - LIS on Tree 2 【構築】 / 【グラフ理論】 / 【動的計画法】 / 最長増加部分列 / 部分和問題
ARC175 E - Three View Drawing 【構築】 / 【幾何学】 / 3次元空間
ARC175 F - Append Same Characters 【操作】 / 【文字列】 / 【典型データ構造】 / 【探索法】 / 転倒数 / BIT / 無限文字列 / ローリングハッシュ / Trie木 / Suffix Array / LCP Array / Sparse Table / 二分探索
ABC347
ABC347 A - Divisible 【入門】
ABC347 B - Substring 【入門】
ABC347 C - Ideal Holidays 【探索法】 / 【整数問題・素数】 / 全探索
ABC347 D - Popcount and XOR 【2進法・bit演算】
ABC347 E - Set Add Query 【典型データ構造】 / 累積和
ABC347 F - Non-overlapping Squares 【幾何学】 / 【典型データ構造】 / 2次元グリッド上の3つの重ならない長方形 / 2次元セグメント木 / 2次元Sparse Table
ABC347 G - Grid Coloring 2 【ネットワークフロー】 / 最小カット問題 / 燃やす埋める問題のk値への一般化
AGC066
AGC066 A - Adjacent Difference 【操作】
AGC066 B - Decreasing Digit Sums 【構築】 / 【乱択】 / 【数え上げ・確率・期待値】 / 移動平均法
AGC066 C - Delete AAB or BAA 【操作】 / 【動的計画法】
AGC066 D - A Independent Set 【操作】 / 【動的計画法】
AGC066 E - Sliding Puzzle On Tree 【数え上げ・確率・期待値】 / 【グラフ理論】 / Union-Find
AGC066 F - Beautiful String 【操作】 / 【文字列】 / 辞書順
ABC348
ABC348 A - Penalty Kick 【入門】
ABC348 B - Farthest Point 【入門】
ABC348 C - Colorful Beans 【入門】 / 【典型データ構造】
ABC348 D - Medicines on Grid 【グラフ理論】 / BFS
ABC348 E - Minimize Sum of Distances 【グラフ理論】 / 【動的計画法】 / 木の重心 / 全方位木DP
ABC348 F - Oddly Similar 【数え上げ・確率・期待値】 / 【典型データ構造】 / bitset
ABC348 G - Max (Sum - Max) 【探索法】 / 【典型データ構造】 / 分割統治法 / Monotone Minima / Li Chao Tree / SMAWK Algorithm
ABC349
ABC349 A - Zero Sum Game 【入門】
ABC349 B - Commencement 【入門】
ABC349 C - Airport Code 【入門】 / 【貪欲法】 / 【文字列】
ABC349 D - Divide Interval 【典型データ構造】 / セグメント木
ABC349 E - Weighted Tic-Tac-Toe 【ゲーム問題】 / 【動的計画法】 / 【グラフ理論】 / メモ化再帰
ABC349 F - Subsequence LCM 【数え上げ・確率・期待値】 / 【整数問題・素数】 / 【動的計画法】 / 【典型データ構造】 / 素因数分解 / ゼータ・メビウス変換
ABC349 G - Palindrome Construction 【文字列】 / 【グラフ理論】 / 回文 / 辞書順 / Manacherのアルゴリズム
典型要素 問題
【入門】
ABC301 A - Overall Winner / ABC301 B - Fill the Gaps / ABC301 C - AtCoder Cards / ABC302 A - Attack / ABC302 B - Find snuke / ABC303 A - Similar String / ABC303 B - Discord / ABC304 A - First Player / ABC304 B - Subscribers / ABC305 A - Water Station / ABC305 B - ABCDEFG / ABC305 C - Snuke the Cookie Picker / ABC306 A - Echo / ABC306 B - Base 2 / ABC306 C - Centers / ABC307 A - Weekly Records / ABC307 B - racecar / ABC308 A - New Scheme / ABC308 B - Default Price / ABC309 A - Nine / ABC309 B - Rotate / ABC309 C - Medicine / ABC310 A - Order Something Else / ABC310 B - Strictly Superior / ABC310 C - Reversible / ABC311 A - First ABC / ABC311 B - Vacation Together / ABC312 A - Chord / ABC312 B - TaK Code / ABC313 A - To Be Saikyo / ABC313 B - Who is Saikyo? / ABC314 A - 3.14 / ABC314 B - Roulette / ABC314 C - Rotate Colored Subsequence / ABC315 A - tcdr / ABC315 B - The Middle Day / ABC315 C - Flavors / ABC317 A - Potions / ABC317 B - MissingNo. / ABC318 A - Full Moon / ABC318 B - Overlapping sheets / ABC319 A - Legendary Players / ABC319 B - Measure / ABC320 A - Leyland Number / ABC320 B - Longest Palindrome / ABC321 A - 321-like Checker / ABC321 B - Cutoff / ABC322 A - First ABC 2 / ABC322 B - Prefix and Suffix / ABC322 C - Festival / ABC323 A - Weak Beats / ABC323 B - Round-Robin Tournament / ABC323 C - World Tour Finals / ABC324 A - Same / ABC324 B - 3-smooth Numbers / ABC325 A - Takahashi san / ABC325 B - World Meeting / ABC326 A - 2UP3DOWN / ABC326 B - 326-like Numbers / ABC326 C - Peak / ABC327 A - ab / ABC327 B - A^A / ABC327 C - Number Place / ABC328 A - Not Too Hard / ABC328 B - 11/11 / ABC328 C - Consecutive / ABC329 A - Spread / ABC329 B - Next / ABC329 C - Count xxx / ABC329 D - Election Quick Report / ABC330 A - Counting Passes / ABC330 B - Minimize Abs 1 / ABC331 A - Tomorrow / ABC331 B - Buy One Carton of Milk / ABC332 A - Online Shopping / ABC332 B - Glass and Mug / ABC332 C - T-shirts / ABC333 A - Three Threes / ABC333 B - Pentagon / ABC333 C - Repunit Trio / ABC334 A - Christmas Present / ABC335 A - 202<s>3</s> / ABC335 B - Tetrahedral Number / ABC336 A - Long Loong / ABC336 B - CTZ / ABC336 C - Even Digits / ABC337 A - Scoreboard / ABC337 B - Extended ABC / ABC337 C - Lining Up 2 / ABC338 A - Capitalized? / ABC338 B - Frequency / ABC339 A - TLD / ABC339 B - Langton's Takahashi / ABC339 C - Perfect Bus / ABC340 A - Arithmetic Progression / ABC340 B - Append / ABC341 A - Print 341 / ABC341 B - Foreign Exchange / ABC342 A - Yay! / ABC342 B - Which is ahead? / ABC343 A - Wrong Answer / ABC343 B - Adjacency Matrix / ABC343 C - 343 / ABC344 A - Spoiler / ABC344 B - Delimiter / ABC344 C - A+B+C / ABC345 A - Leftrightarrow / ABC345 B - Integer Division Returns / ABC346 A - Adjacent Product / ABC346 B - Piano / ABC346 C - Σ / ABC347 A - Divisible / ABC347 B - Substring / ABC348 A - Penalty Kick / ABC348 B - Farthest Point / ABC348 C - Colorful Beans / ABC349 A - Zero Sum Game / ABC349 B - Commencement / ABC349 C - Airport Code
【貪欲法】
【探索法】
ABC301 E - Pac-Takahashi / ABC302 B - Find snuke / ABC302 C - Almost Equal / ABC302 D - Impartial Gift / ABC303 F - Damage over Time / ARC161 B - Exactly Three Bits / ABC304 D - A Piece of Cake / ABC304 G - Max of Medians / ABC305 C - Snuke the Cookie Picker / ABC305 D - Sleep Log / ABC305 Ex - Shojin / ABC307 C - Ideal Sheet / ABC307 D - Mismatched Parentheses / ARC163 A - Divide String / ARC163 B - Favorite Game / ABC309 C - Medicine / ABC310 B - Strictly Superior / ABC310 D - Peaceful Teams / ABC311 D - Grid Ice Floor / ABC311 G - One More Grid Task / ABC312 C - Invisible Hand / ABC312 E - Tangency of Cuboids / ABC313 F - Flip Machines / ABC314 G - Amulets / ABC314 Ex - Disk and Segments / AGC064 F - No Permutations / ABC315 G - Ai + Bj + Ck = X (1 <= i, j, k <= N) / ABC317 Ex - Walk / ABC318 E - Sandwiches / ABC319 C - False Hope / ABC319 D - Minimum Width / ABC319 E - Bus Stops / ABC320 C - Slot Strategy 2 (Easy) / ABC320 G - Slot Strategy 2 (Hard) / ABC321 B - Cutoff / ABC321 C - 321-like Searcher / ABC321 D - Set Menu / ABC322 C - Festival / ABC322 D - Polyomino / ABC323 C - World Tour Finals / ARC166 D - Interval Counts / ABC324 D - Square Permutation / ABC324 F - Beautiful Path / ARC167 F - Tree Tree Tree / ABC325 B - World Meeting / ABC325 D - Printing Machine / ABC326 B - 326-like Numbers / ABC326 C - Peak / ABC326 D - ABC Puzzle / ABC326 F - Robot Rotation / ABC327 B - A^A / ABC327 C - Number Place / ABC327 F - Apples / ABC328 B - 11/11 / ABC328 E - Modulo MST / ABC329 G - Delivery on Tree / ARC168 C - Swap Characters / ABC330 C - Minimize Abs 2 / ABC331 B - Buy One Carton of Milk / ABC331 E - Set Meal / ABC332 C - T-shirts / ABC332 D - Swapping Puzzle / ABC333 C - Repunit Trio / ABC334 D - Reindeer and Sleigh / ABC336 F - Rotation Puzzle / ABC337 D - Cheating Gomoku Narabe / ABC337 F - Usual Color Ball Problems / ABC337 G - Tree Inversion / ABC338 C - Leftover Recipes / ABC341 C - Takahashi Gets Lost / ABC341 D - Only one of two / ARC172 E - Last 9 Digits / ABC343 C - 343 / ABC343 E - 7x7x7 / ABC344 C - A+B+C / ABC344 G - Points and Comparison / ARC173 A - Neq Number / ARC173 C - Not Median / ABC345 C - One Time Swap / ABC345 D - Tiling / ABC345 G - Sugoroku 5 / ARC174 D - Digit vs Square Root / ABC346 B - Piano / ABC346 D - Gomamayo Sequence / ABC346 F - SSttrriinngg in StringString / ABC346 G - Alone / ARC175 F - Append Same Characters / ABC347 C - Ideal Holidays / ABC348 G - Max (Sum - Max)
全探索
ABC302 B - Find snuke / ARC161 B - Exactly Three Bits / ABC305 C - Snuke the Cookie Picker / ABC307 C - Ideal Sheet / ARC163 A - Divide String / ARC163 B - Favorite Game / ABC310 B - Strictly Superior / ABC312 E - Tangency of Cuboids / ABC313 F - Flip Machines / ABC315 G - Ai + Bj + Ck = X (1 <= i, j, k <= N) / ABC318 E - Sandwiches / ABC319 E - Bus Stops / ABC320 C - Slot Strategy 2 (Easy) / ABC321 B - Cutoff / ABC322 C - Festival / ABC322 D - Polyomino / ABC324 D - Square Permutation / ABC325 B - World Meeting / ABC326 B - 326-like Numbers / ABC326 D - ABC Puzzle / ABC327 B - A^A / ABC327 C - Number Place / ABC328 B - 11/11 / ABC328 E - Modulo MST / ARC168 C - Swap Characters / ABC330 C - Minimize Abs 2 / ABC331 B - Buy One Carton of Milk / ABC332 C - T-shirts / ABC333 C - Repunit Trio / ABC337 D - Cheating Gomoku Narabe / ABC338 C - Leftover Recipes / ABC341 C - Takahashi Gets Lost / ARC172 E - Last 9 Digits / ABC343 C - 343 / ABC343 E - 7x7x7 / ABC344 C - A+B+C / ABC345 C - One Time Swap / ABC346 B - Piano / ABC346 D - Gomamayo Sequence / ABC347 C - Ideal Holidays
bit全探索
二分探索
尺取り法
順列全探索
イベントソート
平面走査
半分全列挙
食塩水
三分探索
分割統治法
ヒストグラム内最大長方形
Monge性
Monotone Minima
SMAWK Algorithm
【典型データ構造】
ARC160 C - Power Up / ARC160 D - Mahjong / ABC302 Ex - Ball Collector / AGC062 E - Overlap Binary Tree / ABC303 G - Bags Game / ABC303 Ex - Constrained Tree Degree / ABC304 Ex - Constrained Topological Sort / ABC305 D - Sleep Log / ABC305 E - Art Gallery on Graph / ABC306 E - Best Performances / ABC306 F - Merge Sets / ABC307 F - Virus 2 / ABC307 Ex - Marquee / ABC308 C - Standings / ABC308 E - MEX / ABC308 F - Vouchers / ARC163 F - Many Increasing Problems / ABC309 F - Box in Box / ABC309 Ex - Simple Path Counting Problem / ABC311 F - Yet Another Grid Task / AGC063 E - Child to Parent / AGC064 C - Erase and Divide Game / AGC064 F - No Permutations / ABC315 Ex - Typical Convolution Problem / ABC317 Ex - Walk / ABC318 C - Blue Spring / ABC318 Ex - Count Strong Test Cases / ABC320 E - Somen Nagashi / ARC165 F - Make Adjacent / ABC321 D - Set Menu / ABC322 F - Vacation Query / ABC323 E - Playlist / ABC324 E - Joint Two Strings / ABC324 G - Generate Arrays / ARC167 F - Tree Tree Tree / ABC325 D - Printing Machine / ABC326 E - Revenge of "The Salary of AtCoder Inc." / ABC327 F - Apples / ABC328 C - Consecutive / ARC168 D - Maximize Update / ARC168 F - Up-Down Queries / ABC330 E - Mex and Update / ABC331 C - Sum of Numbers Greater Than Me / ABC331 D - Tile Pattern / ABC331 E - Set Meal / ABC331 F - Palindrome Query / ABC331 G - Collect Them All / ARC169 C - Not So Consecutive / ARC169 E - Avoid Boring Matches / ABC332 F - Random Update Query / ABC333 E - Takahashi Quest / AGC065 B - Erase and Insert / AGC065 D - Not Intersect / AGC065 E - One Two Three / ABC334 C - Socks 2 / ABC334 D - Reindeer and Sleigh / ABC334 F - Christmas Present 2 / ABC335 C - Loong Tracking / ABC335 F - Hop Sugoroku / ABC337 D - Cheating Gomoku Narabe / ABC337 G - Tree Inversion / ABC338 D - Island Tour / ABC339 C - Perfect Bus / ABC339 E - Smooth Subsequence / ABC339 G - Smaller Sum / ABC340 E - Mancala 2 / ABC341 E - Alternating String / ABC342 F - Black Jack / ABC342 G - Retroactive Range Chmax / ABC343 D - Diversity of Scores / ABC343 F - Second Largest Query / ABC344 C - A+B+C / ABC344 E - Insert or Erase / ABC344 G - Points and Comparison / ARC173 F - Select and Split / ABC345 G - Sugoroku 5 / ARC174 A - A Multiply / ARC174 E - Existence Counting / ARC174 F - Final Stage / ABC346 C - Σ / ABC346 D - Gomamayo Sequence / ABC346 G - Alone / ARC175 F - Append Same Characters / ABC347 E - Set Add Query / ABC347 F - Non-overlapping Squares / ABC348 C - Colorful Beans / ABC348 F - Oddly Similar / ABC348 G - Max (Sum - Max) / ABC349 D - Divide Interval / ABC349 F - Subsequence LCM
累積和
2次元累積和
imos法
座標圧縮
multiset
bitset
安定ソート
MEXのクエリの処理
優先度つきキュー
双方向連結リスト
セグメント木
BIT
遅延評価セグメント木
平方分割
ゼータ・メビウス変換
スライド最小値
Sparse Table
2次元セグメント木
2次元Sparse Table
マージソート
形式的冪級数
NTT
FPS_POW
分割統治FFT
FFTマージテク
指数型母関数
ニュートン法
ラグランジュの反転公式
Convex Hull Trick
Li Chao Tree
slope trick
Relaxed Convolution
動的計画法
ABC301 E - Pac-Takahashi / ABC301 F - Anti-DDoS / ARC160 C - Power Up / ARC160 F - Count Sorted Arrays / AGC062 B - Split and Insert / AGC062 E - Overlap Binary Tree / ABC303 D - Shift vs. CapsLock / ABC303 G - Bags Game / ABC305 G - Banned Substrings / ABC305 Ex - Shojin / ABC306 D - Poisonous Full-Course / ABC306 Ex - Balance Scale / ARC162 D - Smallest Vertices / ARC162 E - Strange Constraints / ARC162 F - Montage / ABC307 E - Distinct Adjacent / ABC307 G - Approximate Equalization / ARC163 D - Sum of SCC / ABC309 E - Family and Insurance / ABC309 G - Ban Permutation / ARC164 D - 1D Coulomb / ARC164 E - Segment-Tree Optimization / ABC310 F - Make 10 Again / ABC310 Ex - Negative Cost / ABC311 E - Defect-free Squares / ABC311 F - Yet Another Grid Task / ABC311 Ex - Many Illumination Plans / ABC312 D - Count Bracket Sequences / ABC312 G - Avoid Straight Line / AGC063 B - Insert 1, 2, 3, ... / AGC063 E - Child to Parent / ABC313 F - Flip Machines / ABC313 Ex - Group Photo / ABC314 E - Roulettes / AGC064 D - Red and Blue Chips / ABC315 F - Shortcuts / ABC317 D - President / ABC317 F - Nim / ABC317 Ex - Walk / ABC318 D - General Weighted Max Matching / ABC319 F - Fighter Takahashi / ABC319 G - Counting Shortest Paths / ABC320 F - Fuel Round Trip / ARC165 E - Random Isolation / ABC321 F - #(subset sum = K) with Add and Erase / ABC321 G - Electric Circuit / ABC322 E - Product Development / ABC323 E - Playlist / ARC166 B - Make Multiples / ABC324 F - Beautiful Path / ABC325 F - Sensor Optimization Dilemma / ABC325 G - offence / ABC327 E - Maximize Rating / ABC327 G - Many Good Tuple Problems / ABC328 G - Cut and Reorder / ABC329 G - Delivery on Tree / ARC168 D - Maximize Update / ARC168 E - Subsegments with Large Sums / ARC169 B - Subsegments with Small Sums / ARC169 C - Not So Consecutive / ARC169 F - Large DP Table / ABC332 E - Lucky bag / ABC332 G - Not Too Many Balls / ABC333 F - Bomb Game 2 / AGC065 B - Erase and Insert / ABC334 F - Christmas Present 2 / ABC335 E - Non-Decreasing Colorful Path / ABC335 F - Hop Sugoroku / ABC336 D - Pyramid / ABC336 E - Digit Sum Divisible / ARC170 C - Prefix Mex Sequence / ARC170 E - BDFS / ABC338 F - Negative Traveling Salesman / ABC339 E - Smooth Subsequence / ARC171 C - Swap on Tree / ARC171 D - Rolling Hash / ABC340 C - Divide and Divide / ABC340 G - Leaf Color / ABC341 F - Breakdown / ARC172 F - Walking / ABC342 F - Black Jack / ABC343 G - Compress Strings / ABC344 D - String Bags / ABC344 F - Earn to Advance / ABC345 E - Colorful Subsequence / ARC174 A - A Multiply / ARC174 C - Catastrophic Roulette / ARC175 D - LIS on Tree 2 / AGC066 C - Delete AAB or BAA / AGC066 D - A Independent Set / ABC348 E - Minimize Sum of Distances / ABC349 E - Weighted Tic-Tac-Toe / ABC349 F - Subsequence LCM
メモ化再帰
bit DP
耳DP
ナップサック問題
個数制限なしナップサック問題
部分和問題
最大部分配列問題
Kadane's Algorithm
最長増加部分列
木DP
期待値DP
部分列DP
2乗の木DP
全方位木DP
桁DP
区間DP
戻すDP
挿入DP
部分集合列挙 bit DP
Alien DP
箱根駅伝DP
重軽再帰DP
グラフ理論
ABC301 E - Pac-Takahashi / ABC301 Ex - Difference of Distance / ARC160 E - Make Biconnected / ABC302 E - Isolation / ABC302 F - Merge Set / ABC302 Ex - Ball Collector / AGC062 E - Overlap Binary Tree / AGC062 F - Preserve Distinct / ABC303 E - A Gift From the Stars / ABC303 Ex - Constrained Tree Degree / ARC161 C - Dyed by Majority (Odd Tree) / ARC161 D - Everywhere is Sparser than Whole (Construction) / ARC161 E - Not Dyed by Majority (Cubic Graph) / ARC161 F - Everywhere is Sparser than Whole (Judge) / ABC304 C - Virus / ABC304 E - Good Graph / ABC304 Ex - Constrained Topological Sort / ABC305 E - Art Gallery on Graph / ABC305 F - Dungeon Explore / ABC306 G - Return to 1 / ABC306 Ex - Balance Scale / ARC162 D - Smallest Vertices / ABC307 F - Virus 2 / ABC308 D - Snuke Maze / ABC308 Ex - Make Q / ARC163 D - Sum of SCC / ABC309 D - Add One Edge / ABC309 E - Family and Insurance / ARC164 B - Switching Travel / ARC164 E - Segment-Tree Optimization / ARC164 F - Subtree Reversi / ABC310 D - Peaceful Teams / ABC310 G - Takahashi And Pass-The-Ball Game / ABC311 C - Find it! / ABC311 D - Grid Ice Floor / ABC311 Ex - Many Illumination Plans / ABC312 G - Avoid Straight Line / AGC063 E - Child to Parent / ABC314 F - A Certain Game / AGC064 B - Red and Blue Spanning Tree / ABC315 E - Prerequisites / ABC317 C - Remembering the Days / ABC317 E - Avoid Eye Contact / ABC318 G - Typical Path Problem / ABC318 Ex - Count Strong Test Cases / ABC319 G - Counting Shortest Paths / ABC320 D - Relative Position / ARC165 C - Social Distance on Graph / ARC165 D - Substring Comparison / ARC165 E - Random Isolation / ABC321 E - Complete Binary Tree / ABC321 G - Electric Circuit / ABC323 G - Inversion of Tree / ABC324 F - Beautiful Path / ARC167 C - MST on Line++ / ARC167 D - Good Permutation / ARC167 F - Tree Tree Tree / ABC325 C - Sensors / ABC325 E - Our clients, please wait a moment / ABC327 D - Good Tuple Problem / ABC327 G - Many Good Tuple Problems / ABC328 E - Modulo MST / ABC328 F - Good Set Query / ABC329 G - Delivery on Tree / ARC169 A - Please Sign / ARC169 F - Large DP Table / ABC333 D - Erase Leaves / AGC065 F - Always Perfect / ABC334 E - Christmas Color Grid 1 / ABC334 G - Christmas Color Grid 2 / ABC335 E - Non-Decreasing Colorful Path / ABC336 G - 16 Integers / ABC337 C - Lining Up 2 / ABC337 G - Tree Inversion / ARC170 E - BDFS / ARC170 F - Edge Deletion 2 / ABC338 D - Island Tour / ABC338 F - Negative Traveling Salesman / ABC339 D - Synchronized Players / ARC171 B - Chmax / ARC171 C - Swap on Tree / ARC171 D - Rolling Hash / ABC340 D - Super Takahashi Bros. / ABC340 G - Leaf Color / ABC341 F - Breakdown / ABC342 E - Last Train / ARC173 D - Bracket Walk / ARC173 F - Select and Split / ABC345 F - Many Lamps / ARC175 D - LIS on Tree 2 / AGC066 E - Sliding Puzzle On Tree / ABC348 D - Medicines on Grid / ABC348 E - Minimize Sum of Distances / ABC349 E - Weighted Tic-Tac-Toe / ABC349 G - Palindrome Construction
DFS
BFS
Union-Find
ダイクストラ
トポロジカルソート
ベルマン・フォード法
ワーシャル・フロイド法
最長経路問題
超頂点
強連結成分分解
二部グラフ
完全二分木
全域木
最小全域木
プリム法
Functional Graph
木の重心
重みつきUnion-Find
LCA
オイラーツアー
2-SAT
Undo可能Union-Find
プリューファーコード
完全マッチング
カルテシアン木
LowLink
ケイリーの定理
誘導部分グラフ
全域部分グラフ
頂点彩色
Auxiliary Tree
オイラー
二重頂点連結成分分解
行列木定理
BEST定理
有向行列木定理
【2進法・bit演算】
部分集合のXORの最大値
chmin掃き出し法(noshi基底)
【数え上げ・確率・期待値】
ARC160 A - Reverse and Count / ARC160 C - Power Up / ARC160 D - Mahjong / ABC302 G - Sort from 1 to 4 / AGC062 C - Mex of Subset Sum / AGC062 E - Overlap Binary Tree / ABC303 Ex - Constrained Tree Degree / ABC304 F - Shift Table / ABC305 G - Banned Substrings / ABC306 F - Merge Sets / ABC306 Ex - Balance Scale / ARC162 A - Ekiden Race / ARC162 D - Smallest Vertices / ARC162 E - Strange Constraints / ARC162 F - Montage / ABC307 E - Distinct Adjacent / ABC307 Ex - Marquee / ABC308 E - MEX / ARC163 D - Sum of SCC / ARC163 F - Many Increasing Problems / ABC309 G - Ban Permutation / ABC309 Ex - Simple Path Counting Problem / ARC164 D - 1D Coulomb / ABC310 D - Peaceful Teams / ABC310 F - Make 10 Again / ABC310 G - Takahashi And Pass-The-Ball Game / ABC312 G - Avoid Straight Line / AGC063 B - Insert 1, 2, 3, ... / AGC063 E - Child to Parent / ABC313 F - Flip Machines / ABC313 G - Redistribution of Piles / ABC313 Ex - Group Photo / ABC314 E - Roulettes / ABC314 F - A Certain Game / AGC064 C - Erase and Divide Game / AGC064 D - Red and Blue Chips / AGC064 F - No Permutations / ABC317 Ex - Walk / ABC318 E - Sandwiches / ABC318 F - Octopus / ABC319 C - False Hope / ARC165 E - Random Isolation / ABC321 G - Electric Circuit / ABC322 G - Two Kinds of Base / ABC323 E - Playlist / ABC323 G - Inversion of Tree / ARC166 C - LU / RD Marking / ABC324 E - Joint Two Strings / ARC167 C - MST on Line++ / ARC167 F - Tree Tree Tree / ABC326 E - Revenge of "The Salary of AtCoder Inc." / ABC327 G - Many Good Tuple Problems / ABC329 G - Delivery on Tree / ARC168 C - Swap Characters / ABC330 D - Counting Ls / ABC330 G - Inversion Squared / ABC331 G - Collect Them All / ARC169 B - Subsegments with Small Sums / ARC169 C - Not So Consecutive / ARC169 F - Large DP Table / ABC332 F - Random Update Query / ABC333 F - Bomb Game 2 / AGC065 B - Erase and Insert / AGC065 D - Not Intersect / AGC065 F - Always Perfect / ABC334 E - Christmas Color Grid 1 / ABC334 G - Christmas Color Grid 2 / ABC335 F - Hop Sugoroku / ABC335 G - Discrete Logarithm Problems / ABC336 G - 16 Integers / ABC337 F - Usual Color Ball Problems / ABC337 G - Tree Inversion / ARC170 B - Arithmetic Progression Subsequence / ARC170 C - Prefix Mex Sequence / ARC170 E - BDFS / ABC338 G - evall / ABC339 F - Product Equality / ARC171 B - Chmax / ARC171 C - Swap on Tree / ARC171 E - Rookhopper's Tour / ARC171 F - Both Reversible / ABC340 G - Leaf Color / ARC172 B - AtCoder Language / ARC172 C - Election / ABC342 F - Black Jack / ABC343 E - 7x7x7 / ABC344 G - Points and Comparison / ARC173 A - Neq Number / ARC173 F - Select and Split / ABC345 G - Sugoroku 5 / ARC174 C - Catastrophic Roulette / ARC174 E - Existence Counting / ABC346 E - Paint / ABC346 G - Alone / ARC175 A - Spoon Taking Problem / AGC066 B - Decreasing Digit Sums / AGC066 E - Sliding Puzzle On Tree / ABC348 F - Oddly Similar / ABC349 F - Subsequence LCM
二項係数・多項係数
鳩の巣原理
主客転倒
包除原理
行列積
繰り返し二乗法
行列累乗
ダブリング
移動平均
カタラン数
積の和典型
除原理
鏡像法
マルコフ連鎖
吸収マルコフ連鎖
固有多項式
1次の多項式行列の行列式
【整数問題・素数
ARC160 B - Triple Pair / ABC304 F - Shift Table / AGC063 D - Many CRT / ABC313 G - Redistribution of Piles / ABC315 G - Ai + Bj + Ck = X (1 <= i, j, k <= N) / ARC165 A - Sum equals LCM / ABC322 G - Two Kinds of Base / ARC166 B - Make Multiples / ARC166 E - Fizz Buzz Difference / ARC166 F - Tangent Addition Formula / ABC324 D - Square Permutation / ARC167 B - Product of Divisors / ABC333 G - Nearest Fraction / AGC065 A - Shuffle and mod K / AGC065 C - Avoid Half Sum / ABC334 B - Christmas Trees / ABC335 G - Discrete Logarithm Problems / ABC336 C - Even Digits / ABC336 E - Digit Sum Divisible / ABC339 F - Product Equality / ARC171 D - Rolling Hash / ABC340 C - Divide and Divide / ABC340 F - S = 1 / ABC341 D - Only one of two / ARC172 E - Last 9 Digits / ABC342 D - Square Pair / ABC343 C - 343 / ARC174 B - Bought Review / ARC174 D - Digit vs Square Root / ABC347 C - Ideal Holidays / ABC349 F - Subsequence LCM
負の数の切り捨て除算
平方数
基数変換
素因数分解
正の約数の総積
拡張ユークリッドの互除法
エラトステネスの篩
カーマイケルの定理
floor sum
メビウス関数
位数
ガウス整数
連分数展開
最良近似分数
シュターン・ブロコ木
関数方程式
【文字列】
ABC301 C - AtCoder Cards / ABC301 F - Anti-DDoS / ABC305 G - Banned Substrings / ABC307 B - racecar / ABC307 D - Mismatched Parentheses / ABC307 Ex - Marquee / ARC163 A - Divide String / ABC310 C - Reversible / ABC312 Ex - snukesnuke / ABC314 C - Rotate Colored Subsequence / ABC314 D - LOWER / AGC064 D - Red and Blue Chips / ABC315 D - Magical Cookies / ABC320 B - Longest Palindrome / ARC165 D - Substring Comparison / ARC166 A - Replace C or Swap AB / ABC324 C - Error Correction / ABC324 E - Joint Two Strings / ABC325 G - offence / ABC326 D - ABC Puzzle / ABC328 D - Take ABC / ABC329 E - Stamp / ARC168 C - Swap Characters / ABC331 F - Palindrome Query / ABC336 G - 16 Integers / ARC170 A - Yet Another AB Problem / ARC171 F - Both Reversible / ARC172 B - AtCoder Language / ARC172 F - Walking / ABC342 C - Many Replacement / ABC343 G - Compress Strings / ABC344 D - String Bags / ARC173 D - Bracket Walk / ABC345 C - One Time Swap / ARC174 E - Existence Counting / ABC346 B - Piano / ABC346 D - Gomamayo Sequence / ABC346 F - SSttrriinngg in StringString / ARC175 B - Parenthesis Arrangement / ARC175 C - Jumping Through Intervals / ARC175 F - Append Same Characters / AGC066 F - Beautiful String / ABC349 C - Airport Code / ABC349 G - Palindrome Construction
辞書順
巡回シフト
括弧列
回文
ローリングハッシュ
Z-algorithm
Trie木
Manacherのアルゴリズム
Suffix Array
LCP Array
無限文字列
編集距離
de Bruijn列
幾何学
グリッドの回転
ユークリッド距離
マンハッタン距離
三角不等式
三角形の成立条件
3次元空間
凸図形上の2点を端点とする線分どうしの交差
2次元グリッド上の3つの重ならない長方形
凸包
グラハムスキャン
【操作】
ARC160 A - Reverse and Count / ARC160 F - Count Sorted Arrays / ABC302 G - Sort from 1 to 4 / AGC062 A - Right Side Character / AGC062 B - Split and Insert / AGC062 F - Preserve Distinct / ABC303 C - Dash / ARC162 B - Insertion Sort 2 / ABC307 G - Approximate Equalization / ARC163 B - Favorite Game / ARC163 C - Harmonic Mean / ARC163 F - Many Increasing Problems / ARC164 A - Ternary Decomposition / AGC063 C - Add Mod Operations / AGC063 F - Simultaneous Floor / ABC313 C - Approximate Equalization 2 / ABC313 E - Duplicate / ABC313 G - Redistribution of Piles / ABC314 G - Amulets / ABC315 D - Magical Cookies / ARC165 B - Sliding Window Sort 2 / ARC165 F - Make Adjacent / ARC166 A - Replace C or Swap AB / ARC167 D - Good Permutation / ABC328 G - Cut and Reorder / ABC329 C - Count xxx / ABC329 E - Stamp / ABC329 F - Colored Ball / ABC329 G - Delivery on Tree / ARC168 A - <Inversion> / ARC168 C - Swap Characters / ARC168 D - Maximize Update / ARC168 F - Up-Down Queries / ABC330 G - Inversion Squared / ABC331 G - Collect Them All / ARC169 A - Please Sign / ARC169 D - Add to Make a Permutation / ARC169 E - Avoid Boring Matches / ABC332 D - Swapping Puzzle / AGC065 B - Erase and Insert / AGC065 E - One Two Three / ABC337 F - Usual Color Ball Problems / ARC170 A - Yet Another AB Problem / ARC170 E - BDFS / ARC170 F - Edge Deletion 2 / ARC171 A - No Attacking / ARC171 B - Chmax / ARC171 C - Swap on Tree / ARC171 E - Rookhopper's Tour / ABC340 E - Mancala 2 / ABC341 E - Alternating String / ABC341 F - Breakdown / ARC172 F - Walking / ABC342 G - Retroactive Range Chmax / ABC344 E - Insert or Erase / ABC344 G - Points and Comparison / ARC173 E - Rearrange and Adjacent XOR / ARC173 F - Select and Split / ABC345 C - One Time Swap / ABC345 F - Many Lamps / ARC174 A - A Multiply / ARC174 B - Bought Review / ABC346 E - Paint / ARC175 B - Parenthesis Arrangement / ARC175 F - Append Same Characters / AGC066 A - Adjacent Difference / AGC066 C - Delete AAB or BAA / AGC066 D - A Independent Set / AGC066 F - Beautiful String
バブルソート
順列の辞書順
転倒数
ランレングス圧縮
逆順に見る
Weighted-Union Heuristic(マージテク)
基数ソート
単位分数分解
【ゲーム問題】
MEX
ニム
Grundy
後退解析
【ネットワークフロー】
最大流問題
最小カット問題
マッチング問題
完全マッチング問題
頂点容量つき完全マッチング問題
燃やす埋める問題のk値への一般化
最小費用流問題
【構築】
【乱択】
インタラクティブ

AtCoder Regular Contest 175 (ARC175) 復習の提出

ARC175を解き直しました。
コンテスト時はBの1完でした。
6連敗です…そして、ARCは2連続で1完早解きしてから2完できず冷えるという、後味の悪い結果に…

復習したときのメモを動画にして提出したもののみ載せます。
www.youtube.com
www.nicovideo.jp

自作ライブラリを使用し、ローカルで事前に明らかに未使用な部分を除いて展開する形で提出しています。展開前のソースコードを記述します。
AtCoderで使えるクレートに含まれない関数などを使っている可能性があること、破壊的変更をこの記事の投稿後にしている可能性があることにご注意ください。
github.com

A問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::{Chars, Usize1};

#[allow(unstable_name_collisions)]
fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,p:[Usize1;n],s:Chars);
    let mut ans=Mint::new(0);
    let mut cnt=Mint::new(1);
    let mut exists=vec![true;n];
    for i in 0..n {
        if exists[(p[i]+1)%n] {
            if s[p[i]]=='R' {
                cnt*=0;
            }
        } else {
            if s[p[i]]=='?' {
                cnt*=2;
            }
        }
        exists[p[i]]=false;
    }
    ans+=cnt;
    let mut cnt=Mint::new(1);
    let mut exists=vec![true;n];
    for i in 0..n {
        if exists[p[i]] {
            if s[p[i]]=='L' {
                cnt*=0;
            }
        } else {
            if s[p[i]]=='?' {
                cnt*=2;
            }
        }
        exists[(p[i]+1)%n]=false;
    }
    ans+=cnt;
    outputln!(ans);
}

B問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use num::Integer;
use proconio::marker::Chars;

#[allow(unstable_name_collisions)]
fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(_:usize,a:usize,b:usize,mut s:Chars);
    let mut lcnt=0usize;
    let mut rcnt=0;
    for &c in &s {
        if c=='(' {
            lcnt+=1;
        } else {
            rcnt+=1;
        }
    }
    let mut ans=0;
    if lcnt<rcnt {
        for c in &mut s {
            if lcnt==rcnt {
                break;
            }
            if *c==')' {
                *c='(';
                rcnt-=1;
                lcnt+=1;
                ans+=b;
            }
        }
    } else if lcnt>rcnt {
        for c in s.iter_mut().rev() {
            if lcnt==rcnt {
                break;
            }
            if *c=='(' {
                *c=')';
                lcnt-=1;
                rcnt+=1;
                ans+=b;
            }
        }
    }
    let mut cnt=0;
    let mut cnt_min=0;
    for &c in &s {
        if c=='(' {
            cnt+=1;
        } else {
            cnt-=1;
        }
        cnt_min.chmin(cnt);
    }
    if cnt_min<0 {
        ans+=(-cnt_min).div_ceil(&2) as usize*min(a,2*b);
    }
    outputln!(ans);
}

C問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use num::clamp;

#[allow(unstable_name_collisions)]
fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,lr:[(usize,usize);n]);
    let mut a=vec![0;n];
    let cost=|a0:usize| {
        let mut ret=0;
        let mut a=a0;
        for i in 1..n {
            let next=clamp(a, lr[i].0, lr[i].1);
            ret+=a.abs_diff(next);
            a=next;
        }
        ret
    };
    a[0]=binary_search(lr[0].0, lr[0].1+1, |mid| {
        cost(mid)<cost(mid-1)
    });
    let mut is_decreased=vec![false;n];
    let mut idx=0;
    for i in 1..n {
        a[i]=clamp(a[i-1], lr[i].0, lr[i].1);
        if a[i-1]>a[i] {
            for j in idx..i {
                is_decreased[j]=true;
            }
        }
        if a[i-1]!=a[i] {
            idx=i;
        }
    }
    for i in (0..n-1).rev() {
        if !is_decreased[i] {
            continue;
        }
        a[i]=max(a[i+1], lr[i].0);
    }
    a.outputln();
}

D問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Usize1;

#[allow(unstable_name_collisions)]
fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,k:usize,uv:[(Usize1,Usize1);n-1]);
    let g=VecGraph::construct_graph(n, n-1, &uv);
    let dist=g.dist_of_shortest_paths(0, false);
    if k<n || k>n+dist.sum() {
        return output_no();
    }
    let sizes=g.sizes_of_subtrees(0);
    let mut sz_idx=vec_range(1..n, |i| (sizes[i],i));
    sz_idx.reverse_sort();
    let mut sum=k-n;
    let mut sgn_dist=vec_range(0..n, |i| (-(dist[i] as isize),i));
    for (s,i) in sz_idx {
        if sum>=s {
            sum-=s;
            sgn_dist[i].0*=-1;
        }
    }
    sgn_dist.sort();
    let mut ans=vec![0;n];
    for p in 0..n {
        ans[sgn_dist[p].1]=p+1;
    }
    output_yes();
    ans.outputln();
}

E問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

#[allow(unstable_name_collisions)]
fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,k:usize);
    let mut ans=vec![];
    if n%3==0 {
        ans.push([0,0,0]);
        if ans.len()%3!=k%3 {
            ans.push([n/3,n/3,n/3]);
        }
        if ans.len()%3!=k%3 {
            ans.push([n/3*2,n/3*2,n/3*2]);
        }
    } else {
        if k%3>0 {
            ans.push([0,0,0]);
        }
        if k%3==2 {
            ans.push([1,1,1]);
        }
    }
    for x in 0..n {
        if ans.len()==k {
            break;
        }
        for y in x..n {
            let z=(2*n-x-y)%n;
            if ans.len()==k {
                break;
            }
            if z<y {
                continue;
            }
            if x==y && y==z {
                continue;
            }
            if n%3>0 && k%3==2 && (x,y)==(1,1) {
                continue;
            }
            ans.push([x,y,z]);
            ans.push([y,z,x]);
            ans.push([z,x,y]);
            if ans.len()==k {
                break;
            }
            if x==y || y==z {
                continue;
            }
            ans.push([y,x,z]);
            ans.push([x,z,y]);
            ans.push([z,y,x]);
        }
    }
    ans.outputlns();
}

F問題

atcoder.jp
atcoder.jp

use std::cmp::Ordering;

use ac_library::FenwickTree;
#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Chars;
use superslice::Ext;

#[allow(unstable_name_collisions)]
fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,s:[Chars;n]);
    let mut ssort=vec_range(0..n, |i| s[i].clone());
    ssort.sort_and_dedup();
    let mut inv_num=0;
    let mut ft=FenwickTree::new(n, 0);
    for i in 0..n {
        let s_num=ssort.lower_bound(&s[i]);
        inv_num+=ft.sum(s_num+1..);
        ft.add(s_num, 1);
    }
    let mut nmax=0;
    for i in 0..n {
        nmax.chmax(s[i].len());
    }
    let b=RollingHashBases::<2>::gen(nmax, 26);
    let rh=vec_range(0..n, |i| s[i].calculate_rolling_hashes('a', &b));
    let mut diffs=vec![vec![];n];
    let mut suffixes=vec![];
    for i in 0..n {
        diffs[i].resize(s[i].len(), 0);
        for j in 0..s[i].len() {
            suffixes.push((i,j));
        }
    }
    let mut left_set=MultiSet::new();
    let mut right_set=MultiSet::new();
    for i in 0..n {
        right_set.insert_one(rh[i].rolling_hash_of_subsequence(0, s[i].len(), &b));
    }
    for i in 0..n {
        right_set.remove_one(rh[i].rolling_hash_of_subsequence(0, s[i].len(), &b));
        for j in 1..s[i].len() {
            let hash=rh[i].rolling_hash_of_subsequence(0, j, &b);
            if let Some(&cnt)=left_set.get(&hash) {
                diffs[i][j]+=cnt as isize;
            }
            if let Some(&cnt)=right_set.get(&hash) {
                diffs[i][j]-=cnt as isize;
            }
        }
        left_set.insert_one(rh[i].rolling_hash_of_subsequence(0, s[i].len(), &b));
    }
    let lcp=|(l_i,l_j):(usize,usize),(r_i,r_j):(usize,usize)| {
        let l_len=s[l_i].len()-l_j;
        let r_len=s[r_i].len()-r_j;
        binary_search(0, l_len+r_len+1, |mid| {
            if mid<=min(l_len,r_len) {
                rh[l_i].rolling_hash_of_subsequence(l_j, l_j+mid, &b)==rh[r_i].rolling_hash_of_subsequence(r_j, r_j+mid, &b)
            } else if mid<=max(l_len,r_len) {
                if l_len>r_len {
                    rh[l_i].rolling_hash_of_subsequence(l_j, l_j+r_len, &b)==rh[r_i].rolling_hash_of_subsequence(r_j, s[r_i].len(), &b)
                    && rh[l_i].rolling_hash_of_subsequence(l_j+r_len, l_j+mid, &b)==rh[l_i].rolling_hash_of_subsequence(l_j, l_j+mid-r_len, &b)
                } else {
                    rh[l_i].rolling_hash_of_subsequence(l_j, s[l_i].len(), &b)==rh[r_i].rolling_hash_of_subsequence(r_j, r_j+l_len, &b)
                    && rh[r_i].rolling_hash_of_subsequence(r_j, r_j+mid-l_len, &b)==rh[r_i].rolling_hash_of_subsequence(r_j+l_len, r_j+mid, &b)
                }
            } else {
                if l_len>r_len {
                    rh[l_i].rolling_hash_of_subsequence(l_j, l_j+r_len, &b)==rh[r_i].rolling_hash_of_subsequence(r_j, s[r_i].len(), &b)
                    && rh[l_i].rolling_hash_of_subsequence(l_j+r_len, l_j+l_len, &b)==rh[l_i].rolling_hash_of_subsequence(l_j, l_j+l_len-r_len, &b)
                    && rh[r_i].rolling_hash_of_subsequence(r_j, r_j+mid-l_len, &b)==rh[l_i].rolling_hash_of_subsequence(l_j+l_len-r_len, l_j+mid-r_len, &b)
                } else {
                    rh[l_i].rolling_hash_of_subsequence(l_j, s[l_i].len(), &b)==rh[r_i].rolling_hash_of_subsequence(r_j, r_j+l_len, &b)
                    && rh[r_i].rolling_hash_of_subsequence(r_j, r_j+r_len-l_len, &b)==rh[r_i].rolling_hash_of_subsequence(r_j+l_len, r_j+r_len, &b)
                    && rh[r_i].rolling_hash_of_subsequence(r_j+r_len-l_len, r_j+mid-l_len, &b)==rh[l_i].rolling_hash_of_subsequence(l_j, l_j+mid-r_len, &b)
                }
            }
        })
    };
    suffixes.sort_by(|&(l_i,l_j),&(r_i,r_j)| {
        let l_len=s[l_i].len()-l_j;
        let r_len=s[r_i].len()-r_j;
        let lcp=lcp((l_i,l_j),(r_i,r_j));
        if lcp==l_len+r_len {
            Ordering::Equal
        } else {
            s[l_i][l_j+lcp%l_len].cmp(&s[r_i][r_j+lcp%r_len])
        }
    });
    let mut ans=inv_num;
    let mut inv_diff_sum=0;
    for i in 0..suffixes.len()-1 {
        let (l_i,l_j)=suffixes[i];
        let (r_i,r_j)=suffixes[i+1];
        let l_len=s[l_i].len()-l_j;
        let r_len=s[r_i].len()-r_j;
        inv_diff_sum+=diffs[l_i][l_j];
        let lcp=lcp((l_i,l_j),(r_i,r_j));
        if lcp!=l_len+r_len {
            ans.chmin((inv_num as isize+inv_diff_sum) as usize+lcp+1);
        }
    }
    let (l_i,l_j)=suffixes[suffixes.len()-1];
    let z=vec!['z'];
    inv_diff_sum+=diffs[l_i][l_j];
    let xy=s[l_i][l_j..].iter().chain(z.iter()).collect::<String>();
    let yx=z.iter().chain(s[l_i][l_j..].iter()).collect::<String>();
    let xy_rh=xy.calculate_rolling_hashes('a', &b);
    let yx_rh=yx.calculate_rolling_hashes('a', &b);
    let lcp=binary_search(0, xy.len()+1, |mid| {
        xy_rh.rolling_hash_of_subsequence(0, mid, &b)==yx_rh.rolling_hash_of_subsequence(0, mid, &b)
    });
    if lcp!=xy.len() {
        ans.chmin((inv_num as isize+inv_diff_sum) as usize+lcp+1);
    }
    outputln!(ans);
}

AtCoder Beginner Contest 346 (ABC346) 復習の提出

ABC346を解き直しました。
コンテスト時はA~Eの5完でした。5連敗とはいえ、今回は流石に青時代も冷えていたと思います…

復習したときのメモを動画にして提出したもののみ載せます。
www.nicovideo.jp
www.youtube.com


自作ライブラリを使用し、ローカルで事前に明らかに未使用な部分を除いて展開する形で提出しています。展開前のソースコードを記述します。
AtCoderで使えるクレートに含まれない関数などを使っている可能性があること、破壊的変更をこの記事の投稿後にしている可能性があることにご注意ください。
github.com

A問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,a:[usize;n]);
    vec_range(0..n-1, |i| a[i]*a[i+1]).outputln();
}

B問題

atcoder.jp
atcoder.jp

use itertools::Itertools;
#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(w:usize,b:usize);
    let p="wbwbwwbwbwbwwbwbwwbwbwbw".chars().collect_vec();
    let wrem=(w.saturating_sub(1))/7;
    if b<wrem*5 {
        return output_no();
    }
    let (w,b)=(w-wrem*7,b-wrem*5);
    for i in 0..12 {
        let (mut wcnt,mut bcnt)=(0,0);
        for j in i..24 {
            if wcnt>w {
                break;
            }
            if p[j]=='w' {
                wcnt+=1;
            } else {
                bcnt+=1;
            }
            if wcnt==w && bcnt==b {
                return output_yes();
            }
        }
    }
    output_no();
}

C問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,k:usize,mut a:[usize;n]);
    a.sort_and_dedup();
    let mut ans=k*(k+1)/2;
    for a in a {
        if a>k {
            break;
        }
        ans-=a;
    }
    outputln!(ans);
}

D問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Chars;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,mut s:Chars,c:[usize;n]);
    for i in (1..n).step_by(2) {
        if s[i]=='1' {
            s[i]='0';
        } else {
            s[i]='1';
        }
    }
    let zero_cost=vec_range(0..n, |i| c[i]*(s[i]=='1') as usize);
    let one_cost=vec_range(0..n, |i| c[i]*(s[i]=='0') as usize);
    let zero_sum=zero_cost.construct_prefix_sum();
    let one_sum=one_cost.construct_prefix_sum();
    let mut ans=usize::MAX;
    for i in 1..n {
        ans.chmin(zero_sum.calculate_partial_sum(0, i)+one_sum.calculate_partial_sum(i, n));
        ans.chmin(one_sum.calculate_partial_sum(0, i)+zero_sum.calculate_partial_sum(i, n));
    }
    outputln!(ans);
}

E問題

atcoder.jp
atcoder.jp

use std::collections::BTreeSet;

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Usize1;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(h:usize,w:usize,m:usize,tax:[(usize,Usize1,usize);m]);
    let mut ans=MultiSet::new();
    let mut h_set=BTreeSet::new();
    let mut w_set=BTreeSet::new();
    for &(t,a,x) in tax.iter().rev() {
        if t==1 {
            if !h_set.contains(&a) && w>w_set.len() {
                ans.increase(x, w-w_set.len());
                h_set.insert(a);
            }
        } else {
            if !w_set.contains(&a) && h>h_set.len() {
                ans.increase(x, h-h_set.len());
                w_set.insert(a);
            }
        }
    }
    if h>h_set.len() && w>w_set.len() {
        ans.increase(0, (h-h_set.len())*(w-w_set.len()));
    }
    outputln!(ans.len());
    for (&c,&x) in &ans {
        outputln!(c,x);
    }
}

F問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Chars;
use superslice::Ext;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,s:Chars,t:Chars);
    let s_len=s.len();
    let t_len=t.len();
    let mut poss=vec![vec![];26];
    for i in 0..s_len {
        poss[s[i].from_lowercase()].push(i);
    }
    for i in 0..s_len {
        poss[s[i].from_lowercase()].push(i+s_len);
    }
    outputln!(binary_search(0, E[18], |k| {
        let mut idx=0;
        for i in 0..t_len {
            if let Some(next_idx)=next(s_len, t_len, &poss, t[i].from_lowercase(), idx, k) {
                if next_idx>=s_len*n {
                    return false;
                }
                idx=next_idx+1;
            } else {
                return false;
            }
        }
        true
    }));
}

fn next(s_len: usize, t_len: usize, poss: &Vec<Vec<usize>>, c: usize, idx: usize, k: usize) -> Option<usize> {
    let ccnt=poss[c].len()/2;
    if ccnt==0 {
        return None;
    }
    if k>ccnt {
        let res=(k-1)/ccnt;
        return next(s_len, t_len, poss, c, idx+res*s_len, k-res*ccnt);
    }
    if idx>=s_len {
        let res=idx/s_len*s_len;
        return if let Some(next)=next(s_len, t_len, poss, c, idx-res, k) {
            Some(next+res)
        } else {
            None
        };
    }
    let pos=poss[c].lower_bound(&idx);
    if pos+k-1>=poss[c].len() {
        return None;
    }
    Some(poss[c][pos+k-1])
}

G問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Usize1;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,a:[Usize1;n]);
    let mut idcs=vec![vec![0];n];
    for i in 0..n {
        idcs[a[i]].push(i+1);
    }
    for i in 0..n {
        idcs[i].push(n+1);
    }
    let mut pq=RevBinaryHeap::<(usize,usize,usize,bool)>::new();
    for i in 0..n {
        if idcs[i].len()<3 {
            continue;
        }
        for j in 0..idcs[i].len()-2 {
            pq.push((idcs[i][j],idcs[i][j+1],idcs[i][j+2],true));
            pq.push((idcs[i][j+1],idcs[i][j+1],idcs[i][j+2],false));
        }
    }
    let mut union=SetUnion::new(n+1);
    let mut ans=0usize;
    for i in 0..n+1 {
        while let Some(&(t,left,right,is_insert))=pq.peek() {
            if t==i {
                pq.pop();
            } else {
                break;
            }
            if is_insert {
                union.insert_range(left..right);
            } else {
                union.remove_range(left..right);
            }
        }
        ans+=union.all_count();
    }
    outputln!(ans);
}

AtCoder Regular Contest 174 (ARC174) 復習の提出

ARC174を解き直しました。
コンテスト時はAの1完でした。正直、本当に苦しいです…

復習したときのメモを動画にして提出したもののみ載せます。

自作ライブラリを使用し、ローカルで事前に明らかに未使用な部分を除いて展開する形で提出しています。展開前のソースコードを記述します。
AtCoderで使えるクレートに含まれない関数などを使っている可能性があること、破壊的変更をこの記事の投稿後にしている可能性があることにご注意ください。
github.com

A問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,c:isize,a:[isize;n]);
    let asum=a.sum();
    let mut ans=asum;
    if c>1 {
        ans.chmax(asum+a.maximum_subarray()*(c-1));
    } else if c<1 {
        ans.chmax(asum+a.minimum_subarray()*(c-1));
    }
    outputln!(ans);
}

B問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(t:usize);
    for _ in 0..t {
        input!(mut a:[usize;5],mut p:[usize;5]);
        a.move_right(1, 0);
        p.move_right(1, 0);
        let top=vec_range(1..=5, |i| i*a[i]).sum();
        let bottom=a.sum();
        let average=top/bottom;
        if average>=3 {
            outputln!(0);
            continue;
        }
        let f=2*a[1]+a[2]-a[4]-2*a[5];
        if p[5]>2*p[4] {
            outputln!(f*p[4]);
        } else if f%2==0 || p[5]<p[4] {
            outputln!((f+1)/2*p[5]);
        } else {
            outputln!(f/2*p[5]+p[4]);
        }
    }
}

C問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize);
    let ninv=Mint::new(1)/n;
    let mut ans=vec![vec![Mint::new(1),Mint::new(0),Mint::new(0)],vec![Mint::new(0),Mint::new(1),Mint::new(0)]];
    for i in 1..=n {
        let tmp=ans[0][2];
        ans[0][2]=ans[1][2];
        ans[1][2]=tmp;
        ans[0][0]=Mint::new(1);
        ans[0][1]=-Mint::new(n-i)*ninv;
        ans[0][2]*=Mint::new(i)*ninv;
        ans[0][2]+=Mint::new(n-i)*ninv;
        ans[1][0]=-Mint::new(n-i)*ninv;
        ans[1][1]=Mint::new(1);
        ans[1][2]*=Mint::new(i)*ninv;
        ans=ans.gaussian_elimination();
    }
    outputln!(ans[0][2],ans[1][2]);
}

D問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(t:usize);
    let mut ranges=RangeSet::<usize>::new();
    ranges.insert_number(1);
    for i in 1..=9 {
        ranges.insert_number(E[2*i]-2*E[i]);
        ranges.insert_range(E[2*i]-E[i]..E[2*i]+E[i]);
    }
    for _ in 0..t {
        input!(n:usize);
        let mut ranges=ranges.clone();
        ranges.remove_range(n+1..2*E[18]);
        let mut ans=0;
        for (l,r) in ranges.ranges() {
            ans+=r-l;
        }
        outputln!(ans);
    }
}

E問題

atcoder.jp
atcoder.jp

use ac_library::{FenwickTree, LazySegtree};
#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Usize1;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,k:usize,p:[Usize1;k]);
    let mut ans=vec![Mint::new(0);n];
    let mut lst=LazySegtree::<RangeAffineTransform<DummyOperation<Mint>>>::new(n);
    let mut cnt=FenwickTree::new(n, 0);
    let mut contains=vec![false;n];
    let invs=Mint::construct_modint_inverses(n);
    let facts=Mint::construct_modint_facts(n);
    let factinvs=Mint::construct_modint_fact_inverses(n, &invs);
    let npr=|n:usize,r:usize| facts[n]*factinvs[n-r];
    for i in 0..n {
        cnt.add(i, 1);
    }
    for i in 0..k {
        let c=cnt.sum(0..p[i]) as usize;
        lst.apply_range(0..p[i], (Mint::new(1),npr(n-i-1,k-i-1)));
        if i<k-1 {
            lst.apply_range(0..p[i], (Mint::new(1),npr(n-i-1,k-i-1)*c.saturating_sub(1)*(k-i-1)*invs[n-i-1]));
            lst.apply_range(p[i]..n, (Mint::new(1),npr(n-i-1,k-i-1)*c*(k-i-1)*invs[n-i-1]));
        }
        ans[p[i]]=lst.get(p[i]);
        cnt.add(p[i], -1);
        contains[p[i]]=true;
    }
    let mut sum=Mint::new(1);
    for i in (0..k).rev() {
        cnt.add(p[i], 1);
        let c=cnt.sum(0..p[i]) as usize;
        ans[p[i]]+=sum;
        sum+=npr(n-i-1,k-i-1)*c;
    }
    for i in 0..n {
        if !contains[i] {
            ans[i]=lst.get(i);
        }
    }
    ans.outputlns();
}

F問題

atcoder.jp
atcoder.jp

use std::collections::BTreeMap;

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,lr:[(isize,isize);n],q:usize);
    let lens=DoublyLinkedList::<(isize,usize,usize)>::new();
    let mut offset=[0,0];
    let mut m=[BTreeMap::<(isize,usize),RcRefCellDoublyLinkedListNode<(isize,usize,usize)>>::new(),BTreeMap::<(isize,usize),RcRefCellDoublyLinkedListNode<(isize,usize,usize)>>::new()];
    for i in (0..n).rev() {
        let (l,r)=lr[i];
        let me=i%2;
        let you=1-me;
        offset[me]+=r-l;
        offset[you]-=r-l;
        m[you].insert((l-offset[you],i), lens.push_front((l-offset[you],you,i)).unwrap());
        let mut inserts=BTreeMap::<(isize,usize),RcRefCellDoublyLinkedListNode<(isize,usize,usize)>>::new();
        let mut removes=[vec![],vec![]];
        for (&(len,idx),node) in m[you].range((isize::MIN,0)..=(-offset[you],n-1)) {
            removes[you].push((len,idx));
            if node.borrow().get().is_none() {
                continue;
            }
            let (m_len,r_len)=if let Some((next_len,_,next_idx))=node.borrow_mut().remove_next() {
                if inserts.contains_key(&(next_len,next_idx)) {
                    inserts.remove(&(next_len,next_idx));
                }
                removes[me].push((next_len,next_idx));
                (len+offset[you],next_len+offset[me])
            } else {
                (0,0)
            };
            let (l_len,_,l_idx)=node.borrow().prev().unwrap().borrow().get().unwrap();
            if inserts.contains_key(&(l_len,l_idx)) {
                inserts.remove(&(l_len,l_idx));
            }
            removes[me].push((l_len,l_idx));
            node.borrow().prev().unwrap().borrow_mut().set((l_len+m_len+r_len,me,l_idx));
            inserts.insert((l_len+m_len+r_len,l_idx), node.borrow().prev().unwrap());
            node.borrow_mut().remove();
        }
        for player in 0..2 {
            for key in &removes[player] {
                m[player].remove(key);
            }
        }
        for (key,val) in &inserts {
            m[me].insert(*key, val.clone());
        }
    }
    let mut ranges=[RangeSet::<isize>::new(),RangeSet::<isize>::new()];
    let mut cur=0;
    for node in &lens {
        let (len,player,_)=node.borrow().get().unwrap();
        if len+offset[player]<=0 {
            eoutputln!(cur,len,player,len+offset[player]);
        }
        ranges[player].insert_range(cur..cur+(len+offset[player]));
        cur+=len+offset[player];
    }
    for _ in 0..q {
        input!(c:isize);
        outputln!(match (ranges[0].contains(c),ranges[1].contains(c)) {
            (true,false) => "Alice",
            (false,true) => "Bob",
            _ => "Draw"
        });
    }
}

AtCoder Beginner Contest 345 (ABC345) 復習の提出

ABC345を解き直しました。
コンテスト時はA~Cの3完でした。DかEかFのどれか1問はせめて解けただろう…

復習したときのメモを動画にして提出したもののみ載せます。

自作ライブラリを使用し、ローカルで事前に明らかに未使用な部分を除いて展開する形で提出しています。展開前のソースコードを記述します。
AtCoderで使えるクレートに含まれない関数などを使っている可能性があること、破壊的変更をこの記事の投稿後にしている可能性があることにご注意ください。
github.com

A問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Chars;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(s:Chars);
    let srle=s.rle();
    output_yes_or_no(srle.len()==3 && srle==vec![('<',1),('=',s.len()-2),('>',1)]);
}

B問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use num::Integer;

#[allow(unstable_name_collisions)]
fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(x:isize);
    outputln!(x.div_ceil(&10));
}

C問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Chars;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(s:Chars);
    let l=s.len();
    let mut cnt=vec![0;26];
    for i in 0..l {
        cnt[s[i].from_lowercase()]+=1;
    }
    let mut ans=0usize;
    let mut same=0;
    for i in 0..26 {
        ans+=cnt[i]*(l-cnt[i]);
        if cnt[i]>1 {
            same=1;
        }
    }
    ans/=2;
    ans+=same;
    outputln!(ans);
}

D問題

atcoder.jp
atcoder.jp

use itertools::Itertools;
#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use superslice::Ext;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,h:usize,w:usize,ab:[[usize;2];n]);
    for s in 0..1<<n {
        let mut p=(0..n).filter(|&k| s&(1<<k)>0).collect_vec();
        do_while!(p.next_permutation(), {
            if dfs(h, w, &ab, p.len(), &p, 0, 0, 0) || dfs(h, w, &ab, p.len(), &p, 0, 1, 0) {
                outputln!("Yes");
                return;
            }
        })
    }
    outputln!("No");
}

fn dfs(h:usize,w:usize,ab:&Vec<Vec<usize>>,l:usize,p:&Vec<usize>,k:usize,dir:usize,mut tile:u128) -> bool {
    let min=tile.trailing_ones() as usize;
    if k==l {
        return min==h*w;
    }
    let (m_i,m_j)=(min/w,min%w);
    for i in m_i..m_i+ab[p[k]][dir] {
        if i>=h {
            return false;
        }
        for j in m_j..m_j+ab[p[k]][1-dir] {
            if j>=w {
                return false;
            }
            if tile&(1<<(i*w+j))>0 {
                return false;
            }
            tile+=1<<(i*w+j);
        }
    }
    dfs(h, w, ab, l, p, k+1, 0, tile) || dfs(h, w, ab, l, p, k+1, 1, tile)
}

E問題

atcoder.jp
atcoder.jp

use std::collections::VecDeque;

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Usize1;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,k:usize,cv:[(Usize1,usize);n]);
    let mut dp=VecDeque::from(vec![vec![];k+1]);
    dp[0]=vec![(0,n)];
    for i in 0..n {
        let (c,v)=cv[i];
        dp.push_front(vec![]);
        for j in 0..=k {
            if dp[j+1].len()>0 {
                if c!=dp[j+1][0].1 {
                    let tmp=dp[j+1][0].0+v;
                    let mut c_exists=false;
                    for vc in &mut dp[j] {
                        if vc.1==c {
                            vc.0.chmax(tmp);
                            c_exists=true;
                            break;
                        }
                    }
                    if !c_exists {
                        dp[j].push((tmp,c));
                    }
                } else {
                    if dp[j+1].len()>1 {
                        let tmp=dp[j+1][1].0+v;
                        let mut c_exists=false;
                        for vc in &mut dp[j] {
                            if vc.1==c {
                                vc.0.chmax(tmp);
                                c_exists=true;
                                break;
                            }
                        }
                        if !c_exists {
                            dp[j].push((tmp,c));
                        }
                    }
                }
            }
            dp[j].sort_by(|l,r| r.cmp(l));
            if dp[j].len()>2 {
                dp[j].pop();
            }
        }
        dp.pop_back();
    }
    if dp[k].len()>0 {
        outputln!(dp[k][0].0);
    } else {
        outputln!(-1);
    }
}

F問題

atcoder.jp
atcoder.jp

use std::collections::BTreeSet;

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Usize1;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,m:usize,k:usize,uv:[(Usize1,Usize1);m]);
    let mut ans=vec![];
    if k==0 {
        outputln!("Yes");
        outputln!(0);
        ans.outputln();
        return;
    }
    let uvi=vec_range(0..m, |i| (uv[i].0,uv[i].1,i+1));
    let g=VecGraph::construct_weighted_graph(n, m, &uvi);
    let mut yet=BTreeSet::new();
    for v in 0..n {
        yet.insert(v);
    }
    let mut par=vec![0;n];
    let mut num=vec![0;n];
    let mut lamp=vec![false;n];
    let mut cnt=0;
    while let Some(start)=yet.pop_first() {
        par[start]=start;
        num[start]=m;
        for gs in g.dfs_postorder(start) {
            match gs {
                GraphSearch::Vertex(true, v) => {
                    yet.remove(&v);
                },
                GraphSearch::VertexEdgeWeight(v, u, w) => {
                    par[u]=v;
                    num[u]=w;
                },
                GraphSearch::Vertex(false, v) => {
                    if par[v]==v {
                        continue;
                    }
                    if !lamp[v] {
                        lamp[v]=true;
                        cnt+=1;
                        cnt-=lamp[par[v]] as usize;
                        lamp[par[v]]=!lamp[par[v]];
                        cnt+=lamp[par[v]] as usize;
                        ans.push(num[v]);
                    }
                    if cnt==k {
                        outputln!("Yes");
                        outputln!(ans.len());
                        ans.outputln();
                        return;
                    }
                }
            }
        }
    }
    outputln!("No");
}

G問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use num_integer::Roots;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,k:usize);
    let mut a=vec![Mint::new(0);n+1];
    let kinv=Mint::new(1)/k;
    if k>n.sqrt()/(n+1).ilog2() as usize {
        a[0]+=1;
        let invs=Mint::construct_modint_inverses(2*n+1);
        let facts=Mint::construct_modint_facts(2*n+1);
        let factinvs=Mint::construct_modint_fact_inverses(2*n+1, &invs);
        let sgn=|r:usize| if r%2>0 { -1 } else { 1 };
        let binom=|n:usize,r:usize| if n>=r { facts[n]*factinvs[r]*factinvs[n-r] } else { Mint::new(0) };
        let neg_binom=|n:usize,r:usize| {
            binom(n+r-1,n-1)*sgn(r)
        };
        let mut kinvpow=kinv;
        for i in 1..n {
            let d=n-1-i;
            for j in 0..=d/k {
                a[i]+=binom(i,j)*sgn(j)*neg_binom(i+1,d-j*k)*sgn(d-j*k);
            }
            a[i]*=kinvpow;
            kinvpow*=kinv;
        }
    } else {
        let mut f=vec![kinv;k+1];
        f[0]*=0;
        dc(n, k, &f, &mut a, 0, n+1, vec![Mint::new(1);n]);
    }
    let p=vec_range(1..=n, |i| a[i-1]-a[i]);
    p.outputlns();
}

fn dc(n:usize,k:usize,f:&Vec<Mint>,a:&mut Vec<Mint>,l:usize,r:usize,mut g:Vec<Mint>) -> Vec<Mint> {
    if l+1==r {
        a[l]=*g.last().unwrap();
        return f.clone();
    }
    let len=min(n, (r-l-1)*k+1);
    g.drain(0..(g.len()-len));
    let m=(l+r)/2;
    let mut fpow=dc(n, k, f, a, l, m, g.clone());
    g.fps_mul_assign(&fpow, len-1);
    let fpow2=dc(n, k, f, a, m, r, g.clone());
    fpow.fps_mul_assign(&fpow2, min(n-1, fpow.len()+fpow2.len()-2));
    fpow
}

atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,k:usize);
    let kinv=Mint::new(1)/k;
    let mut f=vec![kinv;k+1];
    f[0]*=0;
    let mut p=f.fps_pow_coefficients(n+1, n);
    for i in 1..=n {
        p[i]*=Mint::new(k)+1-Mint::new(n)/i;
    }
    p[1..].outputlns();
}

AtCoder Regular Contest 173 (ARC173) (AからEまで) 復習の提出

ARC173を解き直しました。
コンテスト時はAの1完でした。
落水しました。Bの予想が完全に正しかったようなのでダメ元で提出すべきでした。
やっぱり、ある程度時間を使ってしまったらペナ上等でいくべきですね…

復習したときのメモを動画にして提出したもののみ載せます。

自作ライブラリを使用し、ローカルで事前に明らかに未使用な部分を除いて展開する形で提出しています。展開前のソースコードを記述します。
AtCoderで使えるクレートに含まれない関数などを使っている可能性があること、破壊的変更をこの記事の投稿後にしている可能性があることにご注意ください。
github.com

A問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(t:usize);
    for _ in 0..t {
        input!(k:usize);
        outputln!(usize_binary_search(E[18], false, |mid| {
            let mut m=mid;
            let mut cnt=0;
            let mut p=1;
            let mut s=vec![];
            while m>0 {
                s.push((m%10,p));
                m/=10;
                if p>1 {
                    cnt+=p;
                }
                p*=9;
            }
            let mut prev_c=0;
            while let Some((c,p))=s.pop() {
                cnt+=if c==0 || prev_c>=c {
                    c*p
                } else {
                    (c-1)*p
                };
                if prev_c==c {
                    break;
                }
                if p==1 {
                    cnt+=1;
                }
                prev_c=c;
            }
            cnt>=k
        }));
    }
}

B問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,mut xy:[(isize,isize);n]);
    xy.sort();
    let mut ans=n/3;
    for i in 0..n {
        for j in i+1..n {
            let mut cnt=0;
            for k in 0..n {
                if (xy[j].0-xy[i].0)*(xy[k].1-xy[j].1)!=(xy[j].1-xy[i].1)*(xy[k].0-xy[j].0) {
                    cnt+=1;
                }
            }
            ans.chmin(cnt);
        }
    }
    outputln!(ans);
}

C問題

atcoder.jp
atcoder.jp

use std::collections::BTreeSet;

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Usize1;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,p:[Usize1;n]);
    let mut ans=vec![usize::MAX;n];
    let mut gcnt=0;
    let mut lcnt=0;
    for i in 1..n {
        if p[i]>p[0] {
            gcnt+=1;
        } else {
            lcnt+=1;
        }
        if i%2==0 && gcnt!=lcnt {
            ans[0]=i+1;
            break;
        }
    }
    let mut gcnt=0;
    let mut lcnt=0;
    for i in (0..n-1).rev() {
        if p[i]>p[n-1] {
            gcnt+=1;
        } else {
            lcnt+=1;
        }
        if (n-1-i)%2==0 && gcnt!=lcnt {
            ans[n-1]=n-i;
            break;
        }
    }
    for i in 1..n-1 {
        if (p[i-1]>p[i])==(p[i+1]>p[i]) {
            ans[i]=3;
        }
    }
    let mut s=BTreeSet::new();
    for i in 0..n-1 {
        if p[i]>0 && p[i+1]>0 {
            s.insert(i);
        }
    }
    let mut pinv=vec![0;n];
    for i in 0..n {
        pinv[p[i]]=i;
    }
    for cur_p in 0..n {
        let idx=pinv[cur_p];
        if cur_p>0 {
            if idx>0 {
                s.remove(&(idx-1));
            }
            if idx<n-1 {
                s.remove(&idx);
            }
        }
        if idx>0 && idx<n-1 && ans[idx]==usize::MAX {
            if let Some(&lmax)=s.range(0..idx).last() {
                ans[idx].chmin(if (idx-lmax+1)%2>0 {
                    idx-lmax+1
                } else {
                    idx-lmax+2
                });
            }
            if let Some(&rmin)=s.range(idx..n).next() {
                let rmin=rmin+1;
                ans[idx].chmin(if (rmin-idx+1)%2>0 {
                    rmin-idx+1
                } else {
                    rmin-idx+2
                });
            }
        }
        if cur_p<n-1 {
            if idx>0 && p[idx-1].cmp(&(cur_p+1))==p[idx].cmp(&(cur_p+1)) {
                s.insert(idx-1);
            }
            if idx<n-1 && p[idx].cmp(&(cur_p+1))==p[idx+1].cmp(&(cur_p+1)) {
                s.insert(idx);
            }
        }
    }
    ans.outputln_val_or(usize::MAX);
}

atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Usize1;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,p:[Usize1;n]);
    let mut ans=vec![usize::MAX;n];
    let mut gcnt=0;
    let mut lcnt=0;
    for i in 1..n {
        if p[i]>p[0] {
            gcnt+=1;
        } else {
            lcnt+=1;
        }
        if i%2==0 && gcnt!=lcnt {
            ans[0]=i+1;
            break;
        }
    }
    let mut gcnt=0;
    let mut lcnt=0;
    for i in (0..n-1).rev() {
        if p[i]>p[n-1] {
            gcnt+=1;
        } else {
            lcnt+=1;
        }
        if (n-1-i)%2==0 && gcnt!=lcnt {
            ans[n-1]=n-i;
            break;
        }
    }
    for i in 1..n-1 {
        if (p[i-1]>p[i])==(p[i+1]>p[i]) {
            ans[i]=3;
        } else {
            let mut l=i-1;
            while l>0 {
                l-=1;
                if (p[l]>p[i])==(p[l+1]>p[i]) {
                    ans[i].chmin(if (i-l+1)%2>0 {
                        i-l+1
                    } else {
                        i-l+2
                    });
                    break;
                }
            }
            let mut r=i+1;
            while r<n-1 {
                r+=1;
                if (p[r]>p[i])==(p[r-1]>p[i]) {
                    ans[i].chmin(if (r-i+1)%2>0 {
                        r-i+1
                    } else {
                        r-i+2
                    });
                    break;
                }
            }
        }
    }
    ans.outputln_val_or(usize::MAX);
}

D問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;
use proconio::marker::Usize1;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,m:usize,uvc:[(Usize1,Usize1,char);m]);
    let uvw=vec_range(0, m, |i| (uvc[i].0,uvc[i].1,if uvc[i].2=='(' { -1 } else { 1 }));
    let g=IsizeGraph::construct_weighted_directed_graph(n, m, &uvw);
    let exists_1=g.rough_bellman_ford(0).is_none();
    let g=IsizeGraph::construct_inversed_weighted_directed_graph(n, m, &uvw);
    let exists_2=g.rough_bellman_ford(0).is_none();
    output_yes_or_no(!(exists_1^exists_2));
}

E問題

atcoder.jp
atcoder.jp

#[allow(unused_attributes)] #[macro_use] #[allow(unused_imports)] use not_leonian_ac_lib::*;

fn main() {
    /// 標準入力のマクロ(インタラクティブ問題ならば中のマクロを変更)
    macro_rules! input {
        ($($tt:tt)*) => {
            proconio::input!($($tt)*);
            // proconio::input_interactive!($($tt)*);
        };
    }

    input!(n:usize,a:[usize;n]);
    if n==2 || n%4!=2 {
        outputln!(vec_range(0, n-1, |i| a[0]^a[i+1]).subset_xor_max());
    } else {
        let mut ans=vec_range(0, n-2, |i| a[1]^a[i+2]).subset_xor_max();
        for j in 0..n-1 {
            ans.chmax(vec_range(0, n-2, |i| a[0]^if i<j { a[i+1] } else { a[i+2] }).subset_xor_max());
        }
        outputln!(ans);
    }
}

ARC173 E - Rearrange and Adjacent XORが超面白い

まえがき

こんにちは、ARC173で水落ちした獅子座じゃない人です。
ARC173のE問題が単純な問題設定で一見単純な答えでありつつも、とても非自明な場合分けが必要であると感じました。
また、ARC-Eだけあって解説もとても行間が広く、行間を埋めたり別のアプローチをとって証明を試みたところ、さらに面白く感じたのでまとめます。

問題

atcoder.jp
元の問題文で理解できる問題設定だと思いますが、一応書いておきます。
長さN(\geq 2)の非負整数列A=(A_1,A_2,\ldots,A_N)が入力として与えられます。
非負整数の二項演算で、二進表記の各桁についてXORをとるものを、ビット単位XOR演算\oplusと定義しておきます。

  • Aを好きなように並び替えたものを新たなAとする。
  • 現在のAの長さをnとして、(A_1\oplus A_2,A_2\oplus A_3,\ldots,A_{n-1}\oplus A_n)という長さn-1の数列を新たなAとする。

という操作を(N-1)回繰り返した後、Aは長さ1の整数列になっています。
その唯一の要素をXとしたとき、Xとしてありえる非負整数の最大値を出力する問題となります。

この問題は、Xとしてありえる非負整数の条件を考察し、条件を満たす非負整数の最大値を求めることで解くことができます。
そして、Xとしてありえる非負整数の条件がとても非自明で面白いと感じました。

操作の性質

操作の前半は、Aの長さをn、ある{1,2,\ldots,n}の置換をPとして、A\leftarrow(A_{P_1},A_{P_2},\ldots,A_{P_n})という変換を行うと考えることができます。
ここで、Pが等しい操作を同じ操作であると定義します。
また、長さがともにnである非負整数列ABについて、A\boldsymbol{\oplus}B=(A_1\oplus B_1,A_2\oplus B_2,\ldots,A_n\oplus B_n)という演算を定義しておきます。

長さがnABC=A\boldsymbol{\oplus}Bに同じ操作を行うことを考えます。
まず、操作の前半では、A(A_{P_1},A_{P_2},\ldots,A_{P_n})B(B_{P_1},B_{P_2},\ldots,B_{P_n})、そしてC(A_{P_1}\oplus B_{P_1},A_{P_2}\oplus B_{P_2},\ldots,A_{P_n}\oplus B_{P_n})に変換されます。
したがって、C=A\boldsymbol{\oplus}Bという関係は保たれます。

改めて添字をおき直し、操作の後半について考えます。
操作の後半では、A(A_1\oplus A_2,A_2\oplus A_3,\ldots,A_{n-1}\oplus A_n)B(B_1\oplus B_2,B_2\oplus B_3,\ldots,B_{n-1}\oplus B_n)、そしてC( (A_1\oplus B_1)\oplus (A_2\oplus B_2),(A_2\oplus B_2)\oplus (A_3\oplus B_3),\ldots,(A_{n-1}\oplus B_{n-1})\oplus (A_n\oplus B_n) )に変換されます。
\oplusの交換法則より、C=A\boldsymbol{\oplus}Bという関係は保たれます。

以上より、ABと同じ操作をA\boldsymbol{\oplus}Bに行った結果は、新たなABについてのA\boldsymbol{\oplus}Bになることがわかりました。

また、\oplusの性質より、列の要素は01であるとしてしまって問題ありません。
二進の各桁について新たな列を作り、それぞれに同じ操作を行ったと考えることができます。

条件の考察

01からなる長さNの列について、第i項のみが1で他の項は全て0であるものをe_i\ (1\leq i\leq N)とします。
操作の性質から、各e_iに同じ(N-1)回の操作を行って得られるXの組み合わせについて考えればよいです。

結論を先に述べます。
ある(N-1)回の操作によってk個のe_iX=1となった場合、k個のe_iX=1となる全ての組み合わせについて、それを得る(N-1)回の操作が存在します。
したがって、X=1となるe_iの個数kについてのみ注目すればよいです。
N=2またはN\not\equiv 2\ (\!\!\!\!\!\mod 4)の場合、k2以上N以下の全ての偶数をとります。
N\neq 2かつN\equiv 2\ (\!\!\!\!\!\mod 4)の場合、k2以上N-2以下の全ての偶数をとります。

ある(N-1)回の操作によってk個のe_iX=1となった場合、k個のe_iX=1となる全ての組み合わせについて、それを得る(N-1)回の操作が存在することを、まず証明します。
一回目の操作で並び替えを行うことは、e_iの列を置換したのと同じになります。
したがって、一回目の操作で並び替えを行わなかった場合とX=1となるe_iの個数は同じになり、一回目の操作で並び替えを適当に行うことでk個のe_iX=1となる任意の組み合わせに対応する操作を考えることができます。

次に、ありうるkが上のようになることを数学的帰納法で証明します。
まず、N=2について、e_1=(1,0)に操作を行うと1が得られ、e_2=(0,1)に操作を行うと1が得られることから示されます。

次に、N=n-1(\geq 2)で成り立つことを仮定し、N=nについて考えます。
一回目の操作で並び替えを行わないとします。
すると、e_iから得られるX({e_i}_1,{e_i}_2,\ldots,{e_i}_{N-1})({e_i}_2,{e_i}_3,\ldots,{e_i}_N)に同じ(N-2)回の操作を行って得られるX(それぞれX_1,X_2とします)についてのX_1\oplus X_2になります。

i項のみが1で他の項は全て0である長さN-1の列に、ある(N-2)回の操作を行って得られるXx_i\ (1\leq i\leq N-1)とします。以降、この記法を複数用いる場合、全て同じ操作であることを仮定します。
e_1から得られるXx_1e_i\ (2\leq i\lt N)から得られるXx_{i-1}\oplus x_ie_Nから得られるXx_{N-1}となります。
これをもとに、X=1となるe_iの個数としてありえるものを考えることになります。

ここで、先にX=1となるe_iの個数の偶奇について先に考えておきます。
和の偶奇のみを求めるのはまさしくXORそのものです。
x_1\oplus(x_1\oplus x_2)\oplus(x_2\oplus x_3)\oplus\cdots\oplus(x_{N-2}\oplus x_{N-1})\oplus x_{N-1}=0より、X=1となるe_iの個数は偶数であることがわかります。

1. N\equiv 1\ (\!\!\!\!\!\mod 4)またはN=3の場合
x_i=1となる個数は2,4,\ldots,N-1が考えられます。
したがって、x_{N-1}以外のx_iは自由に決めることができます。ただし、全てのx_i\ (i\lt N-1)0である場合のみ作れません。
つまり、e_{N-1},e_N以外から得られる(N-2)個のXは自由に決めることができます。ただし、e_i\ (i\lt N-1)までから得られる全てのX0である場合のみ作れません。
また、X=1となるe_{N-1},e_N以外のe_iの個数が奇数であった場合、必ずe_{N-1},e_Nから得られるXの片方のみが1となります。
よって、X=1となるe_iの個数として、2からN-1までの全ての偶数がありえることがいえました。
また、X=1となるe_iの個数を0にすることはできないこともいえるため、X=1となるe_iの個数としてありえるのは、2以上N以下の全ての偶数であることがわかりました。

2. N\equiv 3\ (\!\!\!\!\!\mod 4)かつN\gt 3の場合
x_i=1となる個数は2,4,\ldots,N-3が考えられます。
全てのx_i1にできないことのみ、1.の場合と異なります。
しかし、全てのx_i1である場合のX=1となるe_iの個数は(N+1)/2個であり、別のx_iの組み合わせによって達成できます。
よって、1.と同様の議論により、X=1となるe_iの個数としてありえるのは、2以上N以下の全ての偶数であることがわかりました。

3. N\equiv 0\ (\!\!\!\!\!\mod 4)の場合
x_i=1となる個数は2,4,\ldots,N-2が考えられます。
したがって、x_{N-1}以外のx_iは自由に決めることができます。
つまり、e_{N-1},e_N以外から得られる(N-2)個のXは自由に決めることができます。
ほとんどの偶数については1.と同様の議論により、達成できることがいえます。しかし、0Nについては別に考える必要があります。
X=1となるe_iの個数を0にするには、x_i=1となる個数が0である必要があり、これは無理です。
一方、X=1となるe_iの個数を1にするには、x_i=1となる個数がN/2である必要があります。N/2は偶数であり、問題ありません。
よって、X=1となるe_iの個数としてありえるのは、2以上N以下の全ての偶数であることがわかりました。

4. N\equiv 2\ (\!\!\!\!\!\mod 4)かつN\gt 2の場合
x_i=1となる個数は2,4,\ldots,N-2が考えられます。
3.と同様の議論をすることができますが、3.の場合と異なり、N/2は奇数となります。
よって、X=1となるe_iの個数をNにすることはできないことがいえ、X=1となるe_iの個数としてありえるのは、2以上N-2以下の全ての偶数であることがわかりました。

以上より、ありうるkが上のようになることがいえました。
この条件を、一般のAに応用します。

A_iの二進でのd桁目をA_i^{(d)}とします。
元の非負整数列Aの二進の各桁について新たな列を作り、それぞれに同じ操作を行ったと考えます。
すると、各列はe_iを使って、\pmb{\bigoplus}_{\{i\ |\ A_i^{(d)}=1\}} e_iと表せます。
したがって、e_iからある(N-1)回の操作を行って得られるXx_iとして、各列から得られるX\bigoplus_{\{i\ |\ A_i^{(d)}=1\}} x_iと表せます。
XORの単位元0であり、A_i^{(d)}x_iもともに01をとることから、\bigoplus_{\{i\ |\ A_i^{(d)}=1\}} x_i=\bigoplus_{\{i\ |\ x_i=1\}} A_i^{(d)}と書き換えられます。
各桁に対してのこの結果を合わせると、Aから得られるXとしてありえるのは\bigoplus_{\{i\ |\ x_i=1\}} A_iの形であることがわかりました。

結局、長さNAから得られるXとして、Aから好きにk個とった総ビット単位XOR演算の結果が全てありえることがわかりました。
ここで、N=2またはN\not\equiv 2\ (\!\!\!\!\!\mod 4)の場合、k2以上N以下の全ての偶数をとり、N\neq 2かつN\equiv 2\ (\!\!\!\!\!\mod 4)の場合、k2以上N-2以下の全ての偶数をとります。

条件を踏まえた解法

まず、A_1\oplus A_2,A_1\oplus A_3,\ldots,A_1\oplus A_Nを考えると、それから一部をとっての総ビット単位XOR演算は必ずAから偶数個とった総ビット単位XOR演算と同じになります。
A_1\oplus A_1=0より、A_1\oplus A_2,A_1\oplus A_3,\ldots,A_1\oplus A_Nから奇数個とっての総ビット単位XOR演算はA_1を含んで偶数個とった総ビット単位XOR演算となります。
そして、A_1\oplus A_2,A_1\oplus A_3,\ldots,A_1\oplus A_Nから偶数個とっての総ビット単位XOR演算はA_1を含まず偶数個とった総ビット単位XOR演算となります。

したがって、この問題はA_1\oplus A_2,A_1\oplus A_3,\ldots,A_1\oplus A_Nの部分集合の総ビット単位XOR演算の最大値を求める問題に帰着されます。
この問題は有名問題であり、たとえばこのような方法で時間\Theta(Nd)(ただしdは二進での桁数)で求めることができます。
www.geeksforgeeks.org

Aから一つもとらない場合は0なので気にする必要はないですが、N\neq 2かつN\equiv 2\ (\!\!\!\!\!\mod 4)の場合はAから全て選んでしまう場合を考慮する必要があります。
A_iを使わない場合を全探索すればよく、この場合でも時間\Theta(N^2 d)で求められます。
公式解説では、noshi基底を用いて線形独立でない場合やそもそもAから全て選んで最大値にならない場合を先に省いていますが、それをしなくても最悪計算量のオーダーは変わりません。(もちろん最良計算量のオーダーは変わります。)