가변 차로

시간 제한1초메모리 제한128 MB

요약
가변 차선을 언제 전환해야 대기 차량 총합이 최소가 되는지 모든 전환 시점을 시뮬레이션으로 찾는 문제입니다.
난이도

보통10점 중 5점

유형
시뮬레이션, 누적 합, 완전 탐색
정답자
아직 제출이 없습니다

문제

두 지역을 잇는 강 위에 새 다리가 놓였다. 다리가 병목이다. 다리에는 양방향이 함께 쓰는 차로가 모두 nn개뿐이지만, 다리로 이어지는 양쪽 도로는 그보다 넓기 때문이다.

교통량은 대칭이 아니다. 아침에는 대부분의 차량이 왼쪽 강변에서 오른쪽 강변으로 이동하고, 저녁에는 대부분 오른쪽에서 왼쪽으로 이동한다. 그래서 다리는 왼쪽→오른쪽 전용 차로 n1n_1개, 오른쪽→왼쪽 전용 차로 n2n_2개, 그리고 방향을 바꿀 수 있는 가변 중앙 차로 11개로 구성되며 n1+1+n2=nn_1 + 1 + n_2 = n을 만족한다. 아침에는 중앙 차로가 왼쪽→오른쪽 방향으로 열려 있고, 어느 시점에 오른쪽→왼쪽 방향으로 전환된다. 이 전환을 언제 하는 것이 가장 좋은지 정하는 것이 목표다.

하루는 길이가 같은 시간 구간으로 나뉜다. 차로 하나가 한 구간에 정확히 차량 한 대를 건너기 시작하게 할 수 있도록 구간 길이가 정해져 있다. 구간은 아침의 11번부터 저녁의 mm번까지 번호가 매겨진다. 각 구간마다 왼쪽 강변과 오른쪽 강변에 도착하는 차량 수가 주어진다.

각 구간에서 양쪽 방향 모두 다음 순서로 진행된다.

  1. 새 차량이 다리에 도착한다.
  2. 해당 방향으로 현재 열려 있는 차로 수만큼(차로 하나당 한 대씩) 차량이 건너기 시작한다.
  3. 건너기 시작하지 못한 차량은 다음 구간까지 대기열에서 기다린다.

mm번 구간 이후로는 새 차량이 도착하지 않는다. mm번 구간이 끝난 뒤에도 기다리는 차량이 있으면, 모든 차량이 건너기 시작할 때까지 같은 방식으로(도착 차량 없이) 구간을 계속 진행한다.

중앙 차로의 방향 전환은 즉시 이루어지지 않는다. 반대 방향 차량이 쓰기 전에 차로를 비워야 하므로, 전환 동안 rr개 구간만큼 닫혀 있다. 전환을 tt번 구간(1≤t≤m1 \le t \le m)에 시작하면 열려 있는 차로는 다음과 같다.

  • tt번 구간 이전: 왼쪽→오른쪽 n1+1n_1 + 1개, 오른쪽→왼쪽 n2n_2개;
  • tt번 구간부터 t+r−1t + r - 1번 구간까지(양 끝 포함): 왼쪽→오른쪽 n1n_1개, 오른쪽→왼쪽 n2n_2개(중앙 차로가 닫힘);
  • t+rt + r번 구간 이후: 왼쪽→오른쪽 n1n_1개, 오른쪽→왼쪽 n2+1n_2 + 1개.

총 대기 시간은 모든 구간과 양쪽 방향에 대해, 각 구간이 끝난 시점에 대기열에 남아 있는 차량 수(33단계의 값)를 모두 더한 값이다. 총 대기 시간을 최소로 만드는 구간 tt(1≤t≤m1 \le t \le m)를 구하라. 최솟값을 만드는 구간이 여러 개면 가장 이른 것을 출력한다.

입력

첫 줄에 네 정수 n1n_1, n2n_2, mm, rr가 주어진다. 1≤n1,n2≤101 \le n_1, n_2 \le 10, 1≤m≤1000001 \le m \le 100000, 1≤r≤m1 \le r \le m이다.

다음 mm개의 줄에는 11번부터 mm번까지 각 구간의 정보가 순서대로 주어진다. 각 줄에는 두 정수가 있으며, 그 구간에 왼쪽 강변에 도착하는 차량 수와 오른쪽 강변에 도착하는 차량 수를 나타낸다. 각 구간에 각 강변으로 도착하는 차량은 최대 100100대다.

출력

총 대기 시간을 최소로 만드는 가장 이른 전환 구간 tt를 정수 하나로 출력한다.

힌트

아래 표는 첫 번째 예제에 대해 최적 전환 구간 t=4t = 4를 사용했을 때의 모델을 보여 준다. 각 구간마다 방향별로 열린 차로 수, 도착한 차량(11단계), 건너기 시작한 차량(22단계), 대기열에 남은 차량(33단계)을 나타낸다. 총 대기 시간은 2020구간이다(왼쪽→오른쪽 1010, 오른쪽→왼쪽 1010). 1111번 구간은 그 이후로 대기 중인 차량이 없음을 분명히 하기 위해 함께 표시했다.

time1234567891011
left-to-right lanes33322222222
left-to-right cars12343210100
left-to-right cross12322222100
left-to-right queue00023320000
right-to-left lanes22222333333
right-to-left cars01223353210
right-to-left cross01222333330
right-to-left queue00001133200

예제2

  1. 예제 1

    입력
    2 2 10 2
    1 0
    2 1
    3 2
    4 2
    3 3
    2 3
    1 5
    0 3
    1 2
    0 1
    
    예상 출력
    4
    
  2. 예제 2

    입력
    3 3 12 2
    10 0
    10 0
    10 0
    8 0
    5 2
    2 5
    0 8
    0 10
    0 10
    0 10
    0 6
    0 3
    
    예상 출력
    4