淡々

プログラミング関連を中心に、様々なことを適当に書きます

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

概要・感想

尺取法ってのもなかなか思いつかなかったし、バグらせるしで大変だった。

[l, r]が各lに対する条件を満たす区間で最も長いものとなる。

提出コード

n, k = map(int, input().split())
a = list(map(int, input().split()))

da = {v: 0 for v in set(a)}

l = 0
r = 0
cnt = 0
rlim = [0] * n
skip = False

while l < n:
    # print(l, r, cnt)
    while (not skip) and r < n - 1 and cnt <= k:
        da[a[r]] += 1
        if da[a[r]] == 1:
            cnt += 1
        if r + 1 == n or (da[a[r+1]] == 0 and cnt == k):
            skip = True
            break
        r += 1

    # print(l,r, da)
    rlim[l] = r
    da[a[l]] -= 1
    if da[a[l]] == 0:
        cnt -= 1
        if r < n - 1:
            skip = False
            r += 1
    l += 1

# print(rlim)
# print(a)
ans = 0
for i in range(n):
    ans = max(ans, rlim[i]-i+1)
print(ans)