ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 7041 |
문제명 | Dividing the Path |
레벨 | 플래티넘 4 |
분류 |
dp, monotone deque |
시간복잡도 | O(n) |
인풋사이즈 | n<=1,000,000 |
사용한 언어 | Python |
제출기록 | 68748KB / 684ms |
최고기록 | 684ms |
해결날짜 | 2022/10/15 |
"""Solution code for "BOJ 7041. Dividing the Path".
- Problem link: https://www.acmicpc.net/problem/7041
- Solution link: http://www.teferi.net/ps/problems/boj/7041
Tags: [DP] [Monotone deque]
"""
import collections
import sys
INF = float('inf')
def main():
N, L = [int(x) for x in sys.stdin.readline().split()]
A, B = [int(x) for x in sys.stdin.readline().split()]
interval_left_count, interval_right_count = [0] * (L + 1), [0] * (L + 1)
for _ in range(N):
S, E = [int(x) for x in sys.stdin.readline().split()]
interval_left_count[S] += 1
interval_right_count[E] += 1
min_range, max_range = A * 2, B * 2
deq = collections.deque([INF])
dp = [None] * (L + 1)
dp[0] = 0
interval_count = interval_left_count[0] - interval_right_count[0]
for i in range(1, L + 1):
interval_count -= interval_right_count[i]
if i % 2 == 1 or interval_count > 0:
dp[i] = INF
else:
dp[i] = deq[0] + 1
interval_count += interval_left_count[i]
if (right := i + 1 - min_range) >= 0:
val_to_add = dp[right]
while deq and deq[-1] > val_to_add:
deq.pop()
deq.append(val_to_add)
if (left := i - max_range) >= 0:
if deq[0] == dp[left]:
deq.popleft()
print('-1' if dp[-1] == INF else dp[-1])
if __name__ == '__main__':
main()