목차

추출하는 폴도 바리스타입니다

ps
링크acmicpc.net/…
출처BOJ
문제 번호15648
문제명추출하는 폴도 바리스타입니다
레벨플래티넘 4
분류

DP, 세그먼트 트리

시간복잡도O(nlogm)
인풋사이즈n<=500,000, m<=500,000
사용한 언어Python
제출기록85976KB / 5424ms
최고기록5424ms
해결날짜2022/07/26

풀이

코드

"""Solution code for "BOJ 15648. 추출하는 폴도 바리스타입니다".

- Problem link: https://www.acmicpc.net/problem/15648
- Solution link: http://www.teferi.net/ps/problems/boj/15648

Tags: [Segment tree] [DP]
"""

from teflib import segmenttree


def main():
    N, k, d = [int(x) for x in input().split()]
    S = [int(x) for x in input().split()]

    size = max(S) + 1
    segtree = segmenttree.MinSegmentTree(size)
    max_vals_for_mod = [0] * k
    for s_i in S:
        max_in_mod = max_vals_for_mod[(mod := s_i % k)]
        beg = 0 if s_i < d else s_i - d
        end = size if size < (p := s_i + d + 1) else p
        max_in_range = -segtree.query(beg, end)
        dp_i = (max_in_range if max_in_range > max_in_mod else max_in_mod) + 1

        max_vals_for_mod[mod] = dp_i
        segtree.set(s_i, -dp_i)

    print(max(max_vals_for_mod))


if __name__ == '__main__':
    main()