自分用メモ

プログラミングとかのメモを書きたいです

競プロ典型90問:034 - There are few types of elements(★4)

問題

https://atcoder.jp/contests/typical90/tasks/typical90_ah

挑戦結果

  • 挑戦日:2021/10/08
  • 結果:解けた
  • 時間:30分ぐらい

考えたこと

  • しゃくとり法のように構成すれば良さそう
  • 現在見ている左部分(l)と右部分(r)の座標を保持する。
  • 登場した数字の個数はdictでカウントする
    • 最初setで数字が登場したかだけで判定しておりWAだった。
  • 進め方
    • K個以下の場合:rを右にすすめる。(もっと増える可能性あり)
    • K個以上の場合:lをすすめる。

公式解説

解説を読んだふりかえり

  • 想定通りだったので、特に話。
  • 「最初に座標圧縮を行う場合」というのはなんのことかわからなかった。。。

ソース

N,K = [int(x) for x in input().split()]
A = [int(x) for x in input().split()]

l = -1
r = -1

s = dict()
mm = 0
while l<N:
    if len(s)<=K and r<N:
        mm = max(mm, r-l)
        r+=1
        if r<N:
            s[A[r]] = s.get(A[r],0) + 1
    else:
        l+=1
        if l<N:
            s[A[l]] = s.get(A[l],0) - 1
            if s[A[l]] == 0:
                s.pop(A[l])

print(mm)