목차

Dividing the Path

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