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()