文字列の整形メモ

  • for i in range(6, 15): print(f'{"geeks" :*<{i}}') で文字埋めできたぞ image
  • print(f'observation: {str(observation): <36} ') のように strでないタイプは文字列に変換すれば空白埋めできた

二重ループをbreakできるtipsは初めて知った 確かにbreakしなかった場合は else:continue を通るよなあ

  • 競プロでよく使うけど空で書けないフレーズ https://qiita.com/do_an/items/e5a202cac4fc69fe849d ``` for i in range(10): for j in range(10): for k in range(10): if 25< ijk: ng=(i,j,k) break ok=(i,j,k)

      else:continue
      break
    

    else:continue break

print(ok) # (1, 3, 8) print(ng) # (1, 3, 9) ```

自分のvisualgo を codepen とかで作れるのではないかと思っている

  • https://visualgo.net/

segment tree

* \practicePython\atcoder\segment_tree.py

  • image
  • https://algo-logic.info/segment-tree/より。概念を掴めた。 image

間違えたことがあるもの

  • (1,-1)[x] の9文字を短く表現する方法。
    • 結局1-2*vの5文字がベスト。 -1**x の5文字だと常に -1 を返してしまうので間違い。正しい表記は7文字 (-1)**xで長い。

メモ

  • グラフで木の高さの最小値(木の半径と呼ばれる)は およそ木の直径の半分 下記のコードでいうところの(GetDiam(G)+1)//2
    • 木の直径は任意の点から最も遠い点をゲットし、そこを起点として再び最も遠い点までの距離
      • https://algo-method.com/submissions/1276401
  • nCr のベストな説明
  • image
  • image

(atcoder では使えなかったもの、、、)

available lib at codewars

100問をやる

77 https://github.com/jamad/jamad.github.io/blob/master/_posts/atcoder/practice100_77.md#a—%E6%97%85%E4%BA%BA

アルゴリズム(12 個)

  • 全探索(bit 全探索、順列全探索を含む)
  • 二分探索
  • 深さ優先探索(DFS)
  • 幅優先探索(BFS)
  • 動的計画法(bitDP などを含む)
  • ダイクストラ法(最短経路問題)
  • ワーシャルフロイド法(最短経路問題)
  • クラスカル法(最小全域木問題)
  • 高速な素数判定法
  • べき乗を高速に計算するアルゴリズム
  • 逆元を計算するアルゴリズム
  • 累積和

データ構造(3 個)

  • グラフ(グラフ理論)
  • Union-Find
全探索 二分探索 深さ優先探索 (DFS) 幅優先探索 (BFS)
動的計画法 (DP) ダイクストラ法 ワーシャルフロイド法 クラスカル法
高速な素数判定法 べき乗を高速に計算する手法 逆元を計算する手法 累積和

2-3. 分野別 初中級者が解くべき過去問精選 100 問

  • 記事へのリンク

  • AtCoder 水色コーダー を少ない問題数で達成するために、適切な100 問
  • 分野ごとに問題が分けられています。また、アルゴリズムの確認問題から応用問題まで幅広い層の問題がありますので、是非解いてみることをおすすめします。
  • 難しい問題もあるので、水色コーダーを目指す人は 100 問中 70 問正解を目安に頑張ってください。
  • 100 問全部解けたら、水色コーダー どころか 青色コーダー くらいの実力

全探索:全列挙

全探索:工夫して通り数を減らす全列挙

7 JOI 2007 本選 3 - 最古の遺跡 面白いです。Python3 だと想定解法が TLE する可能性があります。

全探索:ビット全探索

14 Square869120Contest #4 B - Buildings are Colorful! 工夫も必要で、一筋縄では解けない難問ですが、解けば確実に力がつきます。</p>

全探索:順列全探索

17 ALDS_13_A - 8 クイーン問題 面白いです。</p>

二分探索

21 AtCoder Beginner Contest 023 D - 射撃王 教育的に良いです。
22 AtCoder Regular Contest 054 B - ムーアの法則 微分して二分法をすると解けます。三分探索と話が繋がってくるので、それも調べてみると良いと思います。
23 JOI 2008 本選 3 - ダーツ 工夫して二分探索する、チャレンジ問題です。</p>

深さ優先探索

26 AtCoder Beginner Contest 138 D - Ki 木構造の問題の多くは、深さ優先探索を使います。
27 JOI 2009 予選 4 - 薄氷渡り 深さ優先探索は、木構造だけではありません、ということを教えてくれる問題です。再帰関数を使って解けます。</p>

幅優先探索

31 JOI 2012 予選 5 - イルミネーション 少し実装が重いですが、頑張れば解けます。
32 AOJ 1166 - 迷図と命ず 実装が少し重いです。
33 AtCoder Beginner Contest 088 D - Grid Repainting これが解ければ、幅優先探索に慣れたと思って良いです。</p>

動的計画法:ナップザック DP

36 DPL_1_C - ナップザック問題 基本問題です。
38 ALDS_10_C - 最長共通部分列 基本問題です。</p>

(ここから先は、どのような DP で解けるのかは書きませんが、全部ナップザック DP またはその亜種で解くことができます。)

40 JOI 2012 予選 4 - パスタ
41 JOI 2013 予選 4 - 暑い日々
42 JOI 2015 予選 4 - シルクロード
43 パ研杯2019 D - パ研軍旗
44 AOJ 1167 - ポロック予想
45 AOJ 2199 - 差分パルス符号変調</p>

動的計画法:区間 DP

46 ALDS_10_B - 連鎖行列積 基本問題です。
47 JOI 2015 本選 2 - ケーキの切り分け 2 O(N2) の区間 DP です。
48 AOJ 1611 ダルマ落とし O(N3) の区間 DP です。

動的計画法:bit DP

49 DPL_2_A - 巡回セールスマン問題 基本問題です。
50 Square869120Contest #1 G - Revenge of Traveling Salesman Problem 巡回セールスマン問題を少し変えた問題です。
51 JOI 2014 予選 4 - 部活のスケジュール表 bitDP に含まれるか微妙ですが、一応入れておきます。
52 JOI 2017 予選 4 - ぬいぐるみの整理 少し難しいですが、是非挑戦してみてください。

動的計画法:その他

その他の DP として代表的なものは、最長増加部分列問題 (LIS) です。
53 DPL_1_D - 最長増加部分列
54 AtCoder Beginner Contest 006 D - トランプ挿入ソート
55 AtCoder Beginner Contest 134 E - Sequence Decomposing チャレンジ問題です。

最短経路問題:ダイクストラ法

58 JOI 2016 予選 5 - ゾンビ島 前述の幅優先探索も使います。実装がやや重めです。
59 JOI 2014 予選 5 - タクシー</p>

最短経路問題:ワーシャルフロイド法

60 GRL_1_C - 全点対間最短経路 基本問題です。
61 AtCoder Beginner Contest 012 D - バスと避けられない運命
62 AtCoder Beginner Contest 079 D - Wall
63 AtCoder Beginner Contest 074 D - Restoring Road Network ちょっと数学的考察が必要で難しいですが、是非解いてみましょう。

最小全域木問題

64 GRL_2_A - 最小全域木 基本問題です。
65 JOI 2010 春合宿 - Finals (問題pdf) JOI 春合宿の問題ですが、比較的簡単です。
66 AOJ 1127 - Building a Space Station
67 AtCoder Beginner Contest 065 D - Built? やや難しいです。単純に最小全域木を求めると、N 頂点 N2 辺になりますが、なんとそれを減らすことができます。

高速な素数判定法

68 NTL_1_A - 素因数分解 基本問題です。
69 AtCoder Beginner Contest 084 D - 2017-like Number

高速なべき乗計算

70 NTL_1_B - べき乗
71 Square869120Contest #1 E - 散歩
※ べき乗だけを使う問題は少ないですが、nCr などを求める際に、逆元とセットで出てくることが多いです。例えば、ax1 (mod p) の解は ap2 mod p となります。(p が素数の場合)

逆元を使う問題

72 AtCoder Beginner Contest 034 C - 経路 nCr を求めるだけの基本問題です。
73 AtCoder Beginner Contest 145 D - Knight
74 AtCoder Beginner Contest 021 D - 多重ループ
75 AtCoder Beginner Contest 149 F - Surrounded Nodes チャレンジ問題です。解けなくても、「そういう特殊な出力形式の問題ってあるんだな」と感じてほしいです。

累積和

76 全国統一プログラミング王決定戦本戦 A - Abundant Resources 基本です。累積和を使わなくても解けますが、是非使って解いてみてください。
77 JOI 2010 本選 1 - 旅人
78 JOI 2011 本選 1 - 惑星探査 二次元累積和です。
79 AtCoder Beginner Contest 106 D - AtCoder Express 2
80 GigaCode 2019 D - 家の建設

(ここから先は、「いもす法」というアルゴリズムを使う場合があります。)

image

81 AtCoder Beginner Contest 014 C - AtColor 基本問題です。
82 AOJ 2013 - 大崎
83 JOI 2015 本選 1 - 鉄道運賃
84 JOI 2012 本選 4 - 釘 チャレンジ問題です。

Union-Find

85 DSL_1_A - 互いに素な集合 基本問題です。
86 AtCoder Beginner Contest 075 C - Bridge 深さ優先探索による連結成分の個数の数え上げでも解けますが、Union-Find でも解いてみましょう。
87 AtCoder Beginner Contest 120 D - Decayed Bridge 一個の考察ステップがあり、少し難しいですが、解くことで得られる力は大きいと思います。

その他のテクニック

「圧縮」によって解ける問題たちです。

88 JOI 2008 本選 1 - 碁石ならべ
89 JOI 2013 本選 1 - 電飾

「単純な幾何計算」によって解ける問題たちです。標準ライブラリに存在する、2 乗根・三角関数などを使うと解けます。

90 Square869120Contest #5 B - Emblem
91 AtCoder Beginner Contest 144 D - Water Bottle 本記事では触れていませんが、三角関数の逆関数を使って解くことができます。

実装問題

考察に比べて実装がとても重い問題です。練習になると思います。

92 AOJ 1193 - 連鎖消滅パズル
93 Square869120Contest #3 B - 石落としゲーム
94 AOJ 1149 - ケーキカット

数学的な問題

AtCoder の問題の一部では、解くために数学的な考察を必要とします。上級編にも繋げていくために、水色コーダーを目指している人は「数学的考察って何なのか」「数学的考察ってどんな感じで使うのか」くらいは知っておくと良いと思うので、これを感じられる問題の代表例を紹介しておきます。

95 AtCoder Beginner Contest 149 B - Greedy Takahashi 200-300 点問題で出る数学的問題は大体そんな感じです。(貪欲法アルゴリズムに繋がってきます。)
96 AtCoder Beginner Contest 139 D - ModSum 考察一個です。
97 AtCoder Beginner Contest 150 D - Semi Common Multiple
98 三井住友信託銀行プログラミングコンテスト2019 予選 E - Colorful Hats 2
99 DDCC2020 予選 D - Digit Sum Replace これも考察一個です。
100 Tenka1 Programmer Beginner Contest D - Crossing やや難しいですが、頑張って解いてください。


これが全部解けたら、自信をもって「水色コーダー相当の実力」があるといってよいです。
--- # 分野別 初中級者が解くべき過去問精選 100 問

全探索:全列挙

  1. ITP1 7B 組み合わせの数

  2. ABC106B 105

  3. ABC122B ATCoder

  4. パ研杯2019 3C カラオケ

全探索:工夫して通り数を減らす全列挙

  1. ABC095C Half and Half

  2. 三井住友信託銀行プログラミングコンテスト2019D Lucky PIN

  3. JOI2007本戦C 最古の遺跡

  4. Square869120Countest#6B - AtCoder Market

  5. JOI2008予選4 星座探し

全探索:ビット全探索

  1. ALDS1 5A 総当たり

  2. ABC128C Switches

  3. ABC002D 派閥

  4. JOI2008予選5 おせんべい

  5. Square869120Contest#4B Buildings are Colorful!

全探索:順列全探索

  1. ABC145C Average Length

  2. ABC150C Count Order

  3. ALDS1 13A 8クイーン問題

二分探索

  1. ALDS1 4B 二分探索

  2. JOI2009本選2 ピザ

  3. ABC077C Snuke Festival

  4. ABC023D 射撃王

  5. ARC054B ムーアの法則

  6. JOI2008本選C ダーツ

深さ優先探索

  1. ALDS1 11B 深さ優先探索

  2. AOJ1160 島はいくつある?

  3. ABC138D Ki

  4. JOI2009予選D 薄氷渡り

幅優先探索

  1. ALDS1 11C 幅優先探索

  2. ABC007C 幅優先探索

  3. JOI2011予選E チーズ

  4. JOI2012予選E イルミネーション

  5. AOJ1166 迷図と命ず

  6. ABC088D Grid Repainting

動的計画法:ナップザック DP

  1. ALDS1 10A フィボナッチ数列

  2. DPL1B 0-1ナップザック問題

  3. DPL1C ナップザック問題

  4. DPL1A コイン問題

  5. ALDS1 10C 最長共通部分列

ナップサックDPまたはその亜種

  1. JOI2011予選D 1年生

  2. JOI2012予選D パスタ

  3. JOI2013予選D 暑い日々

  4. JOI2015予選D シルクロード

  5. パ研杯2019 3D パ研軍旗

  6. AOJ1167 ポロック予想

  7. AOJ2199 Differential Pulse Code Modulation

動的計画法:区間 DP

  1. ALDS1 10B 連鎖行列積

  2. JOI2015本選B ケーキの切り分け2

  3. AOJ1611 ダルマ落とし

動的計画法:bit DP

  1. DPL2A 巡回セールスマン問題

動的計画法:その他

  1. DPL1D 最長増加部分列

  2. ABC006D トランプ挿入ソート

  3. ABC134E Sequence Decomposing

最短経路問題:ダイクストラ法

  1. GRL1A 単一始点最短経路

  2. JOI2008予選F 船旅

  3. JOI2016予選E ゾンビ島

  4. JOI2014予選E タクシー

最短経路問題:ワーシャルフロイド法

  1. GRL1C 全点対間最短経路

  2. ABC012D バスと避けられない運命

  3. ABC079D Wall

  4. ABC074D Restoring Road Network

最小全域木問題

  1. GRL2A 最小全域木

  2. ABC065D Built?

高速な素数判定法

  1. NTL1A 素因数分解

  2. ABC084D 2017-like Number

高速なべき乗計算

  1. NTL1B べき乗

  2. Square869120Countest#1E - 散歩 (E869120 and Path Length)

逆元を使う問題

  1. ABC034C 経路

  2. ABC145D Knight

  3. ABC021D 多重ループ

累積和

  1. 全国統一プログラミング王決定戦本戦A Abundant Resources

  2. JOI2010本選A 旅人

  3. JOI2011本戦A 惑星探索

  4. ABC106D AtCoder Express 2

  1. GigaCode2019D 家の建設

いもす法

  1. ABC014C AtColor

  2. AOJ2013 大崎

  3. JOI2015本選A 鉄道旅行

Union-Find

  1. DSL1A 互いに素な集合

  2. ABC075C Bridge

  3. ABC120D Decayed Bridge

その他のテクニック

圧縮

  1. JOI2008本戦A 碁石ならべ

  2. JOI2013本選1 電飾

単純な幾何計算

  1. Square869120Contest#5B - Emblem

  2. ABC144D Water Bottle

実装問題

  1. AOJ1193 連鎖消滅パズル

数学的な問題

  1. ABC149B Greedy Takahashi

  2. ABC139D ModSum

  3. ABC150D Semi Common Multiple

  4. 三井住友信託銀行プログラミングコンテスト2019E Colorful Hats 2

  5. DDCC2020予選D Digit Sum Replace

  6. Tenka1 Programmer Beginner Contest 2018D Crossing