せっかくだし入緑記録を書こう

 

 

 

 

折角緑コーダーになれたので、記念記事でも書いていこうと思います。

 

▼入茶記事

AtCoder 入茶記念として勉強法を改める - volcano-tofu’s blog

 

 

 

 

入茶記事の最後の方に「緑になるときはD問題100問解く!」とか書いてあるんですが、実際はD問題76問で済みました。

 

 

自分にとって無理のある目標を作るというのは向かないな、と今は反省しています。

現実味のある、今の自分が背伸びして届きそうな目標を立てて今後は頑張りたい。

 

 

 

そういえば、入緑にかけてですが、A問題とB問題は基本的に解いていないです。C もほとんど解いていない。(C はあくまで復習ぐらいしかしていないかも)

↓これは入茶時の記録



A, B, C 問題が各々 +30 ぐらいで、D は +40, E は + 15 ほど。

バチャコンに出たり、解いていないABCを埋めたりで A~C が増えているだけで、実際は D をメインに解いていました。

 

 

 

 

 

・やったこと

 

sano192さんという、とある緑python勢の方がいるのですが、そのsano192さんが出版している本やqiitaの記事を参考に勉強をしました。

 

本は以下のもので、茶コーダーの人が使うには丁度よい難易度だと思います。

https://qiita.com/sano192/items/eb2c9cbee6ec4dc79aaf : 精選50問詳細解説

https://www.amazon.co.jp/dp/B0BBB7RKTP  : 最速で緑になる本

 

ぼくは灰のときから購入しましたが、「自分はこんなものですらわからないのか」と挫折をして、その後半年程やめてしまいました。(今思えば半年間辞めてた人が急に参加し始めて、文法知識は灰レベルなのによく1ヵ月半で入緑できたなと思ってる)

 

 

あと、sano192さんはqiitaの記事でABCの緑diffまでの問題を解説していらっしゃるので、そちらの方を参考にしたりで色々お世話になりました。

qiita.com

 

python かつ 緑コーダー以下の人は検討してみてはいかがでしょうか。動画も投稿されていて、BFSやDFSはsano192さんのを参考にして実装できるようにもなりました。

もう本当に頭が上がらないです。

 

 

あと他にやったことといえば、バチャコンと緑diff, D問題埋めぐらい?

と、気付いたら自然と緑パフォが出てるような感じでした。

 

水パフォのABC271は水diffのDP問題を解けたため、跳ね上がっています。

その後はほぼ安定して緑パフォを出せているように見えます。

 

――――と、いい感じに見えるんですが、この水パフォを叩き出すのが非常に大変なんですよね……。

今後はただでさえ伸びづらいのがわかっているから、生半可な気持ちで取り組まないよう尚更問題の質を高めて苦しまないといけないのか……と、消極的に考えてしまいます。(笑)

水diff普通に難しすぎるのが嫌すぎるし、青diff以降とかもうレベチすぎて……。

 

 

まぁ、緑にかけてやったことはsano192さんの本を読んで、今の自分にはちょっと難しい問題を沢山解いたことぐらいですね……。

佐野さんの本が優秀すぎたというか、ぼくとの相性が良すぎたのがあるかもしれません。

 

 

例えばセグ木を勉強したところで、高度な問題が解けなければ履修したところで使えないアルゴリズムに分類されたりするので、”アルゴリズムを勉強する”というよりかは沢山問題を解いてどういう思考・アルゴリズムが使われているのか?を問いながら学習を進める方が良いような気もする。

 

 

あと、ぼくはこどふぉとかそのほかのやつやったことないです。あとこーだーしか興味なかったのでずっとあとこーだーの問題を解いてました。

 

 

 

・今後したいこと

 

AtCoder Problems の機能にある Recommendation をやろうかなーと考えています。

つよい人の記事を拝見すると大抵の方がやっていらっしゃるんですよねー。

なので、新たにれこめんでーしょんと水diff、E問題埋めをしたいかな。

あとEDPCも解いておきたい。

 

何か特別なやり方とか、近道があるだろう!とか全く思っていないし、何よりもぼく自身が人より倍以上努力しないとできない人間であることを重々承知しているので、上記の通り、今の自分がやるには少し難しい水diff問題やE問題を埋めていこうと思います。

 

(あとEDPCは解説している人が少なすぎる!!強い人の記事は強い人向けに書いてあるような簡素な説明が多かったりで、もう少し詳細に書いて欲しいなーと思ってます。クソ雑魚コーダーなので許してくださいよ)

 

 

 

 

・最後に

 

写経についてちょっと書こうかな。

勉強法に困っている人っていっぱいいると思います。なんならぼくも困っているので気持ちはわかります。

数ある勉強法の中でも写経が話題になることがあるのですが、解けない問題があったら写経してもしなくてもどっちでもいいと思います。(解説ACするのもしなくてもどっちでもいいと思います)

 

初めの頃はBFSやDFSの書き方が全くわからなかったので、何度も何度も写経を繰り返してそのコードを覚えて、書き方を覚えたら他の問題でBFSとかDFSを書いて書いてを繰り返していくうちにそのアルゴリズムの理解度が深まって、次第に自分の力だけでそのアルゴリズムを組めるようになって――――の繰り返しなので、一概にダメとは言えないと思います。

ただ、これは書き方のわからないアルゴリズムを習得するためだけに写経をしていて、最終的に書き方がわかるようになったからダメではない、と結論付けることが可能なだけで、書き方がわからなければダメだよね、になると思います。

 

その問題、アルゴリズムの書き方や考え方がわからないから写経をする、の最終目標はその問題のみならず他の問題に対しても書き方や考え方がわかるようになり、問題が解けるようになる。ということだと思います。応用できるやり方じゃないと伸びるわけないよって話です。

 

あと強い人をちらちら見ていると写経したことないとかえぐい発言をしてる人をたまに見掛けますが、流石に真に受けない方がいいと思います。自分自身はめっちゃ強い人なんです!と胸を張って主張できる人以外は色んな勉強法を何回もかじってみて、何回も咀嚼して、十分味わった方が良いと思います。

ただ参考になる部分は参考になりますので、真似できるところから始めてみるのがいいんじゃないのでしょうか……。(ぼくは Recommendation から始めてみることにします。)

 

 

 

 

 

迫真競プロ部・復習の裏技 【無限精進編】

・バチャコンに参加したのでその復習

 

 

 

 

atcoder.jp

 

実装力かな。苦手。

目処がついても実装力が皆無すぎて TLE ばっかりする。

ACコード

TLEコード

 

 

 

atcoder.jp

 

典型 of 典型問題。重みなし最短経路問題なのでBFS。

ACコード

 

以下の佐野太郎さんの動画がたいへんわかりやすいです。

Dsrxq でも理解できる。

www.youtube.com

 

 

 

atcoder.jp

 

包除原理。包除原理の問題の中でも最も簡単な部類に入る。

pow(i, j, mod) と使いこなせるととてもらく。

ACコード

 

 

 

atcoder.jp

 

考察力?不足している分を補う、という考え方で解いた。

ACコード

 

 

 

atcoder.jp

 

典型 of 典型問題。深さ優先探索

ACコード

 

以下の佐野太郎さんの動画がたいへんわかりやすいです。

Dsrxq でも理解できる。

www.youtube.com

 

 

 

atcoder.jp

 

DP。これがわからなくなったらナップサック DP に戻るとよい。

dp[i][x][y] := 弁当を i 個目まで見て、たこ焼きの個数が x, たい焼きの個数が y になるときの弁当の最小購入数 (買っても買わなくてもよく、X や Y を超えたら X, Y  としてみなす)

と定義するとよい。

 

ACコード

 

 

 

atcoder.jp

 

考察力。3 つ目の条件がキーとなる。

解説を見て目にした「5 で割った余りが等しいもので揃えればよい」で発狂しました。

当たり前のことをどうして気付けなかったんですかね……。

 

ACコード

 

 

 

atcoder.jp

 

これは難しすぎた。解説動画を 2, 3 回ほど見てやっと理解したのだが、実装しようとしたら TLE になりそうだったので諦めた。

 

以下、数列 A を {a1, a2, a3, ..., aN} である。

「A の全要素の最大公約数が X である個数」を求めるのはたいへんむずかしい。

だが、「A の全要素が X の倍数である個数」を求めるのはうんちをするほど簡単である。(これはまくどうんち大学の国語で出題された慣用句のひとつなので、覚えておこう。)

 

A の全要素が X の倍数であるとは、例えば X = 2 の倍数であるなら  A の全要素が 2, 4, 6, ..., のいずれかであればよいから、その個数は K // 2 が N 個より (K // 2) ** N であることがわかる。

しかし、全て 4 だとすると 2 の倍数でもあるのだが、4 の倍数でもある。

そう、余分な個数まで数えてしまっているのだ。

したがって、余分な個数を減らせばよく、これは

d_i = A の全要素の最大公約数が i である個数

D_i = A の全要素が i の倍数である個数

とすると、d_i = D_i - d_(2×i) - d_(3×i) - ...

である。... の部分は K 以下まで行う。

 

提出コードはつよつよコーダーのしょぼうんちの ACコードを参考にさせて頂きました!

 

ACコード(ぼく

つよつよコーダーのAC

 

 

 

atcoder.jp

 

ケツから考えるタイプ。実はグラフとしてみることができ、BFS で解ける。

 

ACコード

 

 

 

atcoder.jp

 

最短経路問題。BFS だが、この手の迷路みたいな二次元問題を解いたことがないと厳しい印象。

 

ACコード

 

 

 

atcoder.jp

 

見方によってはグラフ問題。貪欲法に近い考え方で解ける。

結局、その座標の最も大きい位置と最も小さい位置の 2 つだけ選択すればよい。

これは……bit 全探索か!?と思わせるような文意だが、残念ながら制約がとても大きい。

でも「左の頂点を選択する」 or 「右の頂点を選択する」というのは応用して DP で解くことができる。

しかし本問はそこまでする必要はなく、

1.「今左の頂点にいて」「次左の頂点に移る(その後右の頂点に移る)」か「次右の頂点に移る(その後左の頂点に移る)」

もしくは

2.「今右の頂点にいて」「次左の頂点に移る(その後右の頂点に移る)」か「次右の頂点に移る(その後左の頂点に移る)」

とし、値が最小なのを常に選択することで最適解を得ることができる。

 

▼ かつっぱ氏の動画を参考にしたので、気になる人は見てみよう!

www.youtube.com

 

ACコード

 

 

 

atcoder.jp

 

BFS 問題。「訪問していないなら訪問する」、という設定はいつも通り。

問題なのは訪問済の場合の設定。単に「訪問済の所に訪問するから + 1 増える」とは考えてはいけない(戒め)

なぜなら、それが最短経路である保証がなされていないからである。

したがって、その設定を設ければよく、(次行く頂点の最短歩数) - (今いる頂点の最短歩数) == 1 なら最短経路である保証がなされるためAC!

 

D にしてはやさしいが、茶にしては難易度は高いかも。2 WA しました……。

 

ACコード

 

 

 

atcoder.jp

 

DP。実験するとわかるかもしれない。

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ... として考えるとよい。

dp0 = 0

dp1 = 0

dp2 = 0

dp3 = 1

dp4 = 1

dp5 = 1

dp6 = 2

dp7 = 3

dp8 = 4

dp9 = 6

...

となる。

dp6 は dp3 の結果が使える。

dp7 は dp3, dp4 の結果が使える。

dp8 は dp3, dp4, dp5 の結果が使える。

dp9 は dp3, dp4, dp5, dp6 の結果が使える。

...

dpi は dp3, dp4, ..., dp(i - 3) の結果が使える。(i >= 3)

 

ACコード

 

 

 

atcoder.jp

 

数学問題。

A1B1 = A2B2 = ... = ANBN が成り立つから、なにか 1 つの値がわかれば全ての値がわかりそうだ。

本問が要求している Bi の求め方は A の全要素の LCM がわかればよい。

つかれた。

 

ACコード

 

 

 

atcoder.jp

 

典型 of 典型問題。DFS。

 

以下の佐野太郎さんの動画がたいへんわかりやすいです。

Dsrxq でも理解できる。

www.youtube.com

 

 

 

atcoder.jp

 

累積 GCD っぽいなにか。

left : A の左側 (0, 1, 2, ... N - 2 インデックス) における GCD

right : A の右側 ( N - 1, N - 2, ... ,1 インデックス) における GCD

をつくる。

好きな数字に置き換えてよい、というのは他の数字に置き換えたりしてもよいので、なかったことにできるということ。

O(N²) で解けるが間に合わない。無駄な計算をせずに高速化を図るために累積 GCD を作る。難しいのは左右から作るというところ……。

 

ACコード

 

 

 

atcoder.jp

 

ただの面倒くさい実装。

あまり復習したくない類の問題。

1.1 から 10⁵ まで素数の一覧表をつくる。

2.3, 5 ,7 ,... が素数かつ 2017 に似た数なら累積和のカウント +1

3.クエリから範囲を取得して出力して終わり。

 

めんどくさい……めんどくさくない?

 

ACコード

 

 

 

atcoder.jp

 

うんちぶうううううううううううううううううううううううう

a1, a2, a3, b1, b2, b3 のいずれかの値がわかれば ok

あとは c と一致するかどうかを判定すればおわり

 

ACコード


 

 

atcoder.jp

 

実験しまくった。O(√N) でなんとかして解きたいから、N = 100 の場合を考えた時に

 

100 // 1 = 100

100 // 2 = 50

100 // 3 = 33

100 // 4 = 25

100 // 5 = 20

100 // 6 = 16

100 // 7 = 14

100 // 8 = 12

100 // 9 = 11

100 // 10 = 10

 

これだけで答えがわかるという。……は?そんなことできる……???

 

なんでか知らんけど、割った数と商の関係性に注目すると、

100 // 1 = 100 だが、100 // 100 = 1

100 // 2 = 50 だが、 100 // 50 = 2

100 // 3 = 33 だが 100 // 33 = 3

...

であることに気付いた!

したがって、

100 // 50 = 2

100 // 51 = 1

100 // 52 = 1

100 // 53 = 1

...

100 // 100 = 1

であることがわかる!

割った数と商には何かしらの関係性があったようだ。

 

ここでいくつかの疑問が生じる。

1.いくつまで割ればよいのか?√N まで続ければいい?

2.その関係性はもっと明白にならないのか?

などなど。

 

1について、割った数 i とその商 j が i >= j となったらよさそうだ。

ex) N = 8 のときがそうで、√N とすると i = 2 までなのだが、i >= j とすることで i = 3 まで深堀することができた!

 

2について、商の値の前後がまさに個数で、それに着目すればよいだろう。配列を用意するか、他にデータを保つ方法をとればよい。

 

しかし、ここには欠点があり、1の i >= j は気を付けるべき点が存在した。

それは 1 個重複する可能性があるということ。i = j なら重複はしないのだが、i > j は重複してしまう。

これに気を付けて実装しなければならない。

 

ACコード

  1. import sys
    sys.setrecursionlimit(10**7)

    input_grid = [[0, 0, 8, 7, 0, 0, 0, 1, 0],
    [0, 5, 0, 0, 0, 3, 0, 0, 0],
    [0, 0, 0, 2, 4, 8, 0, 0, 0],
    [0, 9, 0, 0, 0, 0, 0, 2, 4],
    [0, 3, 6, 0, 0, 0, 0, 0, 1],
    [4, 0, 0, 0, 0, 0, 5, 0, 0],
    [0, 0, 0, 3, 8, 7, 0, 0, 0],
    [0, 0, 0, 9, 0, 0, 0, 0, 2],
    [0, 0, 7, 0, 0, 6, 0, 5, 0]]

    def find_next_cell(grid):
    for y in range(9):
    for x in range(9):
    if grid[y][x] == 0:
    # 埋まっていない座標を返す
    return y, x
    # すべてのマスに数字が入っている状態
    return -1, -1

    # 条件を満たすかの判定
    def is_valid(grid, y, x, value):
    # 横のチェック
    is_row = value not in grid[y]
    # 縦のチェック
    is_column = value not in [i[x] for i in grid]
    # ブロックを取り出す
    blk_x, blk_y = (x//3) * 3, (y//3) * 3
    blk_grid = [i[blk_x:blk_x + 3] for i in input_grid[blk_y:blk_y + 3]]
    # ブロックのチェック
    is_block = value not in sum(blk_grid, )
    # 有効チェック
    return all([is_row, is_column, is_block])

    # すべてのマスを調べて数字が最大で何個入りそうなのかを確認する
    def possibility(grid, y, x):
    # インデックス番号
    idx = 0
    # 今考えているマスにどれだけの数字が入りそうなのか
    mass2 =

    # 今考えているマスに
    number2 =
    tmp =

    if grid[y][x] != 0:
    return True
    else:
    cnt = 0
    for value in range(1, 10):
    # もし今考えている数字が入りそうなら
    if is_valid(grid, y, x, value):
    # 最大で入る可能性数を足す
    cnt += 1
    tmp.append(value)
    # そのマスには cnt の数だけ入りそう
    mass2.append([cnt, y, x])
    number2.append(tmp)
    return *mass2, *number2

    mass=
    number=

    mass_num=[]
    for i in range(9):
    for j in range(9):
    if possibility(input_grid, j, i) != True:
    mass.append(possibility(input_grid, j, i)[0])
    number.append(possibility(input_grid, j, i)[1])
    for i in range(len(mass)):
    mass_num.append([mass[i], number[i]])
    mass_num.sort()
    y = mass_num[0][0][1]
    x = mass_num[0][0][2]
    idx = 0
    #print(mass_num[0][0][3]) インデックス番号は 0 0 3 だ!()

    # 実際に数字を再帰的に入れてみる
    def solve_sudoku(grid, idx):
    #[print(i) for i in input_grid]
    Y, X = find_next_cell(grid)
    if Y == X == -1:
    return True
    for value in mass_num[idx][1]:
    if is_valid(grid, mass_num[idx][0][1], mass_num[idx][0][2], value):
    grid[mass_num[idx][0][1]][mass_num[idx][0][2]] = value
    # 次へ
    idx += 1
    if solve_sudoku(grid, idx):
    return True
    grid[mass_num[idx][0][1]][mass_num[idx][0][2]] = 0
    idx -= 1
    return False

    print(solve_sudoku(input_grid, idx))
    [print(i) for i in input_grid]
  2.  
  3.  

AtCoder 入茶記念として勉強法を改める

!注意!

これはよわよわコーダーの独り言です。

この記事を読むより効果があるものを紹介します。

以下のものを見たらこの記事は読む価値がないものだとわかりますので……

(気付いたら AKITO 氏しか貼っていないけど、勉強系だったらこの御方がダントツに信用できるので……)

 

 

www.youtube.com

 

www.youtube.com

 

www.youtube.com

 

 

※追記でこちらも貼らさせて頂きます

 

 

 

 

 

・やっていたこと

1.写経

2.問題解きまくる

3.アルゴリズム習得

4.復習

 

 

 

・やらなかったこと

5.バチャコン

 

 

・おまけ

6.音楽を聴きながら作業することについて

7.今後について

 

 

 

 

・意識したこと、注意するべきことについて

 

 

覚えるべきことは覚えて、理解することは徹底的に理解する、という二点だけ。

あとはその質を維持したまま物量を熟す。何れ少しずつ質を上げることができるようになるため、なるべく質は上げつつ下げないことを意識する。

 

これは……勉強の基本的なことではないだろうか?

裏技なんてものは存在しなかったんだ……

残念ながら、我々は当たり前のことを当たり前にやっていくしかない。それもじっくりと時間を掛けて、じっくり苦しむ必要がある。

 

 

 

・1の写経について

 

 

これはあまりやる必要がなかったかもしれない。コードを丸々書いたからと言って理解できることが少なかったから

ただ、初歩的なアルゴリズム習得時には役立ったと思う

例えば BFS とかは最初のうちはどう書けばいいのかわからなかったので、何度も写経し、覚えては今度はそのコードを思い出しながら書き、忘れるのでまた写経したり覚えなおす。

何回か書いていくうちに自然と覚えていき、その問題だけでも一時的に解けるようになっていく。

そこから違う BFS の問題を解こうとすると、多分解けないんだけど「こういう風に実装すればいいのか!」とか色んなことを吸収できる。

 

そうして何度も何度も違う問題を解いていく際にまた BFS の問題が来ると

 

1.「どう考えればよいのか」

2.「求めたいのはこれ」

3.「こういうのができたら嬉しいな」

4.「全探索したいけど、どう探索すればいいか」

5.「ひとつひとつ見ていけば良さそうだ」

6.「BFS で解けそうだな」

 

というプロセスが生まれ、やっと初めて BFS を実装できる。

ここまで考え抜くことで差が生まれるんだと思う。

今までやってきたことは単なる "問題集を虱潰す" だけであって、実践では "考え抜いて実装する力" が求められる。

ぼく自身は大した勉強もしたつもりもなく、アルゴリズム力もその知識も皆無なのだが、このお陰で何とか ARC 137 を A,B 2 完できたんだと思う。

 

 

 

・2の問題を解きまくるについて

 

 

所謂 "精進" ってヤツ。かんたんに、凡人だと思う人程、よわいと思っている人程、常日頃から問題に触れていないとそりゃ伸びないよねって話。

問題を沢山捌くことで、要求される知識や実装をアウトプットできるので、問題を沢山解きまくることはいいことだと思う。

ただ、上にも記載させて頂いたが、あくまでこれは "質を維持したまま問題を解きまくる" ということを示唆しているので、A 問題を沢山解く!というよりかは C を安定させるために沢山解く!とか、D を解けるようになるために解いてみる!ということである。

残念ながら、当たり前といえば当たり前ですね……

 


▼ C 問題を沢山解いた結果の図

f:id:volcano-tofu:20220320110312p:plain

 

 

 

・3のアルゴリズム習得について

 

 

必須。覚えるべきもの。なので覚える。

DP とかは最近の C でも頻繁に出題されるし、汎用性が高いので入茶する人は覚えるべきものなんだろうなぁと思う。

覚えておいて損はないのだが、その問題しか解けないレベルの理解力や実装力は論外なので、沢山の問題に触れるべき。

問題集でアルゴリズム習得を促し、実践で「こういうのを実装したい」「あのアルゴリズムを使えばいけそうだ」という流れを作れるまで理解し、実装力を高めよう。

 

 

 

・4の復習について

 

 

どうして復習をするのか。についてはどうしても忘れてしまうからとしか言いようがない。

理解できていない部分、見えなかった部分が見えるようになるかもしれないので、なるべく復習はしておくとよい。

当たり前だと思ったかもしれないが、情弱狩りや全く勉強しない人向けの動画とかでもよく言われていることである。

それはつまり……?何を意味しているのか。

 

 

 

・5のバチャコンについて

 

 

これはやった方がよかったかもしれない。

AtCoder は土日にしかコンテストが開かれないので、ABC しか出ない人はほぼほぼ週1しか実践日がない。

しかしこれだと "週に 1 回しか超苦しんで実装をする日" しかなく、初心者の人であるほど週一は効果が薄すぎると思う。

とにかく緑までは物量が大事だと思うので、最低でも週2で バチャコン+ABC をした方がいい。

問題を沢山解くのが悪い事ではないが、適度に、適切に実践を挟んだ方がいいのは間違いない。

最近伸び悩んでいるのでバチャコンを挟んでみようと思う。

 

 

 

・6の音楽を聴きながら作業することについて

 

 

ぼく自身はあまり集中できなかったので聴いていない。

音楽を聴きながら作業することが多かったのだが、ABC は思考力も実装力も求められるレベルがとにかく高いので、音楽を聴くと集中力が下がってむしろ逆効果が多かった。

ASMR はよく聴く方なのだが、その ASMR の音すらも集中を妨げてしまう程。

 

なので集中できる人は聴けばいいしぼくみたいに集中できない人は聴かなければいい。

一応、以下の動画は集中力を妨げることはなく、むしろ高めてくれるから音楽を聴きたいけど聴けない!という人は試してみては如何だろう。

 

 

www.youtube.com

 

www.youtube.com

 

※休憩あり

www.youtube.com[

 

 

 

・7の今後について

 

 

現時点で目指しているのは緑で、できれば青に行きたいなーなんて思っている。

「D 問題 100 題ちょっと解けば緑行けるっしょ!w」と生意気ぶってるので、今は D を沢山解く方針に変えていこうと思う。

あと、茶色になったのは C を 100 題ちょっと解いたのも結構大きいと思う。

 

 

物量を熟すのは正義!w(ただし質を維持した上である)

 

 

以上。

AtCoder 復習 1

【ABC240】

参考:【解説 実況】ABC240 AからD【かつっぱ】 - YouTube

A,B は簡単すぎるので飛ばします。

 

C - Jumping Takahashi ACコード

ジャンプ問題。真偽値を持つ DP で解ける。

 

D - Strange Balls ACコード

スタックを用いる。整数の個数を扱う際に [整数, 個数] と配列で管理する方法が賢すぎた。

pop() とかも忘れないようにしたい。(deque とかも似た操作だよね)

 

 

 

【ABC237】

C - kasaka ACコード

先頭に a を入れたり入れなかったりして文字列 S が回文なれば Yes

コーナーケース (only a) も考慮する必要があって実装がちょっと面倒。

 

D - LR insertion ACコード

おしりから考えるタイプの問題。文字追加を沢山行うため、リストを用いるよりかは deque を使うのがよい。

 

 

【ABC204】

C - Tour ACコード

BFS練習

 

D - Cooking ACコード

DP練習。部分和?というらしい。ガバガバコードでも通った。

 

 

 

【ABC195】

B - Many Oranges ACコード

B 問題だがやや難しい。

N 個みかんを選んだときに条件を満たすかどうかを全探索で調べていく。

while 文を使うと全探索がらくにできる。

 

C - Comma ACコード

解法はすぐ浮かぶが、実装を丁寧に行う必要がある。かも。

 

 

 

【ABC192】

B - uNrEaDaBlE sTrInG ACコード

リストのおべんきょうが深まってるとらく。isupper とか islower を初めて知った。

 

C - Kaprekar Number ACコード

def で無双しよう!

 

D問題は二分探索っぽいですが、実装が大変そうなので解きませんでした。水色diffだし無理して解く必要はないかなーと。

 

 

 

【ABC190】

C - Bowls and Dishes ACコード

bit全探索!Cのbit全探索にしては実装がやや大変?

 

D - Staircase Sequences ACコード

数学問題の中の整数問題。抽象的な等差数列を具体的に考えていく必要がある!

整数問題は (整数)×(整数)=整数 の形に持ち込めると強い。

 

 

 

【ABC178】

C - Ubiquity ACコード

数学力が要求される。包除原理を知ってるかどうか。

あと pow の使い方を知ってるかどうか。

 

D - Redistribution ACコード

DP問題。小さい順に実験していくと、過去の結果を利用できる。というわけでDPを実行。

 

 

 

【ABC131】

C - Anti-Division ACコード

包除原理

 

D - Megalomania ACコード

恐らく貪欲法

 

 

 

単品

 

C - Travel ACコード

itertools 練習

 

C - IPFL ACコード

クエリによる文字列操作の典型問題に慣れよう。

 

C - Compass Walking ACコード

数学問題?なのかよくわからん

 

C - Mandarin Orange ACコード

2重ループで解けるが、どう実装するか問題

 

C - Unexpressed ACコード

余事象を考えるタイプ

 

C - To 3 ACコード(きれいじゃない)

消すのは 0,1,2 個のいずれかになる。if 文のゴリ押しで解ける。が、きれいじゃない。

 

C - Collinearity ACコード

数学問題。N 個の点から 3 点選び、それが同一直線状に存在するかどうかを調べよ、というもの。

 

C - Sum of product of pairs ACコード(新) ACコード(旧)

数学問題?ΣΣAiAj を求める問題。ACコードが 2 つあるが、やっていることは同じ。

因みに解説は社長が行ったみたいです。

 

C - Step ACコード

for 文と配列の超基本問題。B問題でもいい。

 

C - Walking Takahashi ACコード

数学問題。座標 0 に到達できるかどうかを考えてから方針を分岐する。

越えられないならその座標を、越えられるのなら偶奇で分けて出力する。

 

C - H and V ACコード

bit全探索。だがちょっと難しい。二次元配列で考えるbit全探索なので、今まで一次元しか扱っていない人だと少し躓くかも。

基本的には考えられる全探索を行い、その各々のループについて全てのマスを全探索で調べればよい。

したがって、一次元は

 

for文(bit全探索開始!) → for文(条件を満たすか全探索開始!)

 

の二重だったが、本問は二次元配列なので

 

 for文(についてbit全探索開始!) → for文(についてbit全探索開始!) → for文(について条件を満たすか全探索開始!) → for文(について条件を満たすか全探索開始!)

 

という四重ループを実装する必要がある。

 

C - Multiplication 3 ACコード

実装力が要求される、気がする。小数点以下をどう処理するかが難しい。そこで replace() を使うという変態的発想で解ける。

 

C - Skill Up ACコード

bit全探索の超基本!やったことない人は本問を使うとよい。

 

D - I hate Factorization ACコード

A⁵-B⁵=X を満たす A,B∈ℤ をひとつでも求めればよい!

数学問題に見せかけて全探索で解ける、実装力要求タイプである。

 

D - String Formation ACコード

クエリによる文字列操作に慣れよう!文字を追加する操作があるので、配列よりも deque を用いる方がよい。

 

D - Dice in Line ACコード

数学問題?サイコロの期待値を求め、累積和を求める問題。慣れておきたい。

 

D - Caracal vs Monster ACコード

分裂した敵にも同じ行動を繰り返すので 2 倍して +1 する必要がある!

難易度は低いが、考察力が要求される。

 

C - Snack ACコード

最小公倍数 LCM を求める問題。

 

D - Triangles ACコード

長さが与えられて三角形ができる個数を求める問題。

bisect を使うとよい。

 

D - Powerful Discount Tickets ACコード

heapq を使う。

 

D - Ki ACコード

BFS練習

 

C - Switches ACコード

bit全探索。やや難しいかも。

 

 

 

 

 

 

今まで解いた問題を列挙しただけで満足してしまった。定期的に復習しつつ、DPの理解度を深めつつ、様々なアルゴリズムを習得したい。

ACコードの殆どがきたなかったり、余計な部分を迂回していたり、簡略化できる部分もあると思いますが、温かい目で見守ってください()

AtCoder 復習 1

【ABC240】

参考:【解説 実況】ABC240 AからD【かつっぱ】 - YouTube

A,B は簡単すぎるので飛ばします。

 

C - Jumping Takahashi ACコード

ジャンプ問題。真偽値を持つ DP で解ける。

 

D - Strange Balls ACコード

スタックを用いる。整数の個数を扱う際に [整数, 個数] と配列で管理する方法が賢すぎた。

pop() とかも忘れないようにしたい。(deque とかも似た操作だよね)

 

 

 

【ABC237】

C - kasaka ACコード

先頭に a を入れたり入れなかったりして文字列 S が回文なれば Yes

コーナーケース (only a) も考慮する必要があって実装がちょっと面倒。

 

D - LR insertion ACコード

おしりから考えるタイプの問題。文字追加を沢山行うため、リストを用いるよりかは deque を使うのがよい。

 

 

【ABC204】

C - Tour ACコード

BFS練習

 

D - Cooking ACコード

DP練習。部分和?というらしい。ガバガバコードでも通った。

 

 

 

【ABC195】

B - Many Oranges ACコード

B 問題だがやや難しい。

N 個みかんを選んだときに条件を満たすかどうかを全探索で調べていく。

while 文を使うと全探索がらくにできる。

 

C - Comma ACコード

解法はすぐ浮かぶが、実装を丁寧に行う必要がある。かも。

 

 

 

【ABC192】

B - uNrEaDaBlE sTrInG ACコード

リストのおべんきょうが深まってるとらく。isupper とか islower を初めて知った。

 

C - Kaprekar Number ACコード

def で無双しよう!

 

D問題は二分探索っぽいですが、実装が大変そうなので解きませんでした。水色diffだし無理して解く必要はないかなーと。

 

 

 

【ABC190】

C - Bowls and Dishes ACコード

bit全探索!Cのbit全探索にしては実装がやや大変?

 

D - Staircase Sequences ACコード

数学問題の中の整数問題。抽象的な等差数列を具体的に考えていく必要がある!

整数問題は (整数)×(整数)=整数 の形に持ち込めると強い。

 

 

 

【ABC178】

C - Ubiquity ACコード

数学力が要求される。包除原理を知ってるかどうか。

あと pow の使い方を知ってるかどうか。

 

D - Redistribution ACコード

DP問題。小さい順に実験していくと、過去の結果を利用できる。というわけでDPを実行。

 

 

 

【ABC131】

C - Anti-Division ACコード

包除原理

 

D - Megalomania ACコード

恐らく貪欲法

 

 

 

単品

 

C - Travel ACコード

itertools 練習

 

C - IPFL ACコード

クエリによる文字列操作の典型問題に慣れよう。

 

C - Compass Walking ACコード

数学問題?なのかよくわからん

 

C - Mandarin Orange ACコード

2重ループで解けるが、どう実装するか問題

 

C - Unexpressed ACコード

余事象を考えるタイプ

 

C - To 3 ACコード(きれいじゃない)

消すのは 0,1,2 個のいずれかになる。if 文のゴリ押しで解ける。が、きれいじゃない。

 

C - Collinearity ACコード

数学問題。N 個の点から 3 点選び、それが同一直線状に存在するかどうかを調べよ、というもの。

 

C - Sum of product of pairs ACコード(新) ACコード(旧)

数学問題?ΣΣAiAj を求める問題。ACコードが 2 つあるが、やっていることは同じ。

因みに解説は社長が行ったみたいです。

 

C - Step ACコード

for 文と配列の超基本問題。B問題でもいい。

 

C - Walking Takahashi ACコード

数学問題。座標 0 に到達できるかどうかを考えてから方針を分岐する。

越えられないならその座標を、越えられるのなら偶奇で分けて出力する。

 

C - H and V ACコード

bit全探索。だがちょっと難しい。二次元配列で考えるbit全探索なので、今まで一次元しか扱っていない人だと少し躓くかも。

基本的には考えられる全探索を行い、その各々のループについて全てのマスを全探索で調べればよい。

したがって、一次元は

 

for文(bit全探索開始!) → for文(条件を満たすか全探索開始!)

 

の二重だったが、本問は二次元配列なので

 

 for文(についてbit全探索開始!) → for文(についてbit全探索開始!) → for文(について条件を満たすか全探索開始!) → for文(について条件を満たすか全探索開始!)

 

という四重ループを実装する必要がある。

 

C - Multiplication 3 ACコード

実装力が要求される、気がする。小数点以下をどう処理するかが難しい。そこで replace() を使うという変態的発想で解ける。

 

C - Skill Up ACコード

bit全探索の超基本!やったことない人は本問を使うとよい。

 

D - I hate Factorization ACコード

A⁵-B⁵=X を満たす A,B∈ℤ をひとつでも求めればよい!

数学問題に見せかけて全探索で解ける、実装力要求タイプである。

 

D - String Formation ACコード

クエリによる文字列操作に慣れよう!文字を追加する操作があるので、配列よりも deque を用いる方がよい。

 

D - Dice in Line ACコード

数学問題?サイコロの期待値を求め、累積和を求める問題。慣れておきたい。

 

D - Caracal vs Monster ACコード

分裂した敵にも同じ行動を繰り返すので 2 倍して +1 する必要がある!

難易度は低いが、考察力が要求される。

 

C - Snack ACコード

最小公倍数 LCM を求める問題。

 

D - Triangles ACコード

長さが与えられて三角形ができる個数を求める問題。

bisect を使うとよい。

 

D - Powerful Discount Tickets ACコード

heapq を使う。

 

D - Ki ACコード

BFS練習

 

C - Switches ACコード

bit全探索。やや難しいかも。

 

 

 

 

 

 

今まで解いた問題を列挙しただけで満足してしまった。定期的に復習しつつ、DPの理解度を深めつつ、様々なアルゴリズムを習得したい。

ACコードの殆どがきたなかったり、余計な部分を迂回していたり、簡略化できる部分もあると思いますが、温かい目で見守ってください()

AtCoder 復習 1

【ABC240】

参考:【解説 実況】ABC240 AからD【かつっぱ】 - YouTube

A,B は簡単すぎるので飛ばします。

 

C - Jumping Takahashi ACコード

ジャンプ問題。真偽値を持つ DP で解ける。

 

D - Strange Balls ACコード

スタックを用いる。整数の個数を扱う際に [整数, 個数] と配列で管理する方法が賢すぎた。

pop() とかも忘れないようにしたい。(deque とかも似た操作だよね)

 

 

 

【ABC237】

C - kasaka ACコード

先頭に a を入れたり入れなかったりして文字列 S が回文なれば Yes

コーナーケース (only a) も考慮する必要があって実装がちょっと面倒。

 

D - LR insertion ACコード

おしりから考えるタイプの問題。文字追加を沢山行うため、リストを用いるよりかは deque を使うのがよい。

 

 

【ABC204】

C - Tour ACコード

BFS練習

 

D - Cooking ACコード

DP練習。部分和?というらしい。ガバガバコードでも通った。

 

 

 

【ABC195】

B - Many Oranges ACコード

B 問題だがやや難しい。

N 個みかんを選んだときに条件を満たすかどうかを全探索で調べていく。

while 文を使うと全探索がらくにできる。

 

C - Comma ACコード

解法はすぐ浮かぶが、実装を丁寧に行う必要がある。かも。

 

 

 

【ABC192】

B - uNrEaDaBlE sTrInG ACコード

リストのおべんきょうが深まってるとらく。isupper とか islower を初めて知った。

 

C - Kaprekar Number ACコード

def で無双しよう!

 

D問題は二分探索っぽいですが、実装が大変そうなので解きませんでした。水色diffだし無理して解く必要はないかなーと。

 

 

 

【ABC190】

C - Bowls and Dishes ACコード

bit全探索!Cのbit全探索にしては実装がやや大変?

 

D - Staircase Sequences ACコード

数学問題の中の整数問題。抽象的な等差数列を具体的に考えていく必要がある!

整数問題は (整数)×(整数)=整数 の形に持ち込めると強い。

 

 

 

【ABC178】

C - Ubiquity ACコード

数学力が要求される。包除原理を知ってるかどうか。

あと pow の使い方を知ってるかどうか。

 

D - Redistribution ACコード

DP問題。小さい順に実験していくと、過去の結果を利用できる。というわけでDPを実行。

 

 

 

【ABC131】

C - Anti-Division ACコード

包除原理

 

D - Megalomania ACコード

恐らく貪欲法

 

 

 

単品

 

C - Travel ACコード

itertools 練習

 

C - IPFL ACコード

クエリによる文字列操作の典型問題に慣れよう。

 

C - Compass Walking ACコード

数学問題?なのかよくわからん

 

C - Mandarin Orange ACコード

2重ループで解けるが、どう実装するか問題

 

C - Unexpressed ACコード

余事象を考えるタイプ

 

C - To 3 ACコード(きれいじゃない)

消すのは 0,1,2 個のいずれかになる。if 文のゴリ押しで解ける。が、きれいじゃない。

 

C - Collinearity ACコード

数学問題。N 個の点から 3 点選び、それが同一直線状に存在するかどうかを調べよ、というもの。

 

C - Sum of product of pairs ACコード(新) ACコード(旧)

数学問題?ΣΣAiAj を求める問題。ACコードが 2 つあるが、やっていることは同じ。

因みに解説は社長が行ったみたいです。

 

C - Step ACコード

for 文と配列の超基本問題。B問題でもいい。

 

C - Walking Takahashi ACコード

数学問題。座標 0 に到達できるかどうかを考えてから方針を分岐する。

越えられないならその座標を、越えられるのなら偶奇で分けて出力する。

 

C - H and V ACコード

bit全探索。だがちょっと難しい。二次元配列で考えるbit全探索なので、今まで一次元しか扱っていない人だと少し躓くかも。

基本的には考えられる全探索を行い、その各々のループについて全てのマスを全探索で調べればよい。

したがって、一次元は

 

for文(bit全探索開始!) → for文(条件を満たすか全探索開始!)

 

の二重だったが、本問は二次元配列なので

 

 for文(についてbit全探索開始!) → for文(についてbit全探索開始!) → for文(について条件を満たすか全探索開始!) → for文(について条件を満たすか全探索開始!)

 

という四重ループを実装する必要がある。

 

C - Multiplication 3 ACコード

実装力が要求される、気がする。小数点以下をどう処理するかが難しい。そこで replace() を使うという変態的発想で解ける。

 

C - Skill Up ACコード

bit全探索の超基本!やったことない人は本問を使うとよい。

 

D - I hate Factorization ACコード

A⁵-B⁵=X を満たす A,B∈ℤ をひとつでも求めればよい!

数学問題に見せかけて全探索で解ける、実装力要求タイプである。

 

D - String Formation ACコード

クエリによる文字列操作に慣れよう!文字を追加する操作があるので、配列よりも deque を用いる方がよい。

 

D - Dice in Line ACコード

数学問題?サイコロの期待値を求め、累積和を求める問題。慣れておきたい。

 

D - Caracal vs Monster ACコード

分裂した敵にも同じ行動を繰り返すので 2 倍して +1 する必要がある!

難易度は低いが、考察力が要求される。

 

C - Snack ACコード

最小公倍数 LCM を求める問題。

 

D - Triangles ACコード

長さが与えられて三角形ができる個数を求める問題。

bisect を使うとよい。

 

D - Powerful Discount Tickets ACコード

heapq を使う。

 

D - Ki ACコード

BFS練習

 

C - Switches ACコード

bit全探索。やや難しいかも。

 

 

 

 

 

 

今まで解いた問題を列挙しただけで満足してしまった。定期的に復習しつつ、DPの理解度を深めつつ、様々なアルゴリズムを習得したい。

ACコードの殆どがきたなかったり、余計な部分を迂回していたり、簡略化できる部分もあると思いますが、温かい目で見守ってください()