아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

뚫기

시간 제한5초메모리 제한1024 MB

요약
N개의 막이 있는 N×M 터널에서 순간이동 비용 A와 막 통과 비용 B가 주어질 때 최소 총비용을 구합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 세그먼트 트리, 정렬
정답자
아직 제출이 없습니다

문제

가까운 미래 싱가포르에서는 뚫기라는 게임이 유행 중이다. 게임 규칙은 간단하다. 쐐기 모양의 비행선이 N×MN \times M 크기의 터널을 왼쪽에서 오른쪽으로 통과하도록 움직이면 된다. 터널에는 비행선의 전진을 방해하는 초록색 막이 NN개 있다. 막은 각 칸의 왼쪽 벽에 위치하며, 여러 칸에 걸쳐 이어진 막은 하나의 막으로 본다. 편의상 비행선의 전진 방향을 xx축, 그에 수직인 방향을 yy축이라고 하면, 같은 xx좌표에는 막이 하나만 있다.

비행선은 각 칸에서 두 가지 움직임 중 하나를 할 수 있다. 첫 번째는 순간이동이다. 순간이동은 비행선을 현재 칸과 같은 xx좌표의 임의의 칸으로 옮긴다. 목적지가 어디든 비용은 항상 AA이다. 예를 들어 아래 그림은 (0,1)(0, 1)에 있는 비행선이 (0,5)(0, 5)로 순간이동하는 경우이며, 이때 비용 AA가 든다.

두 번째는 전진이다. 비용은 00이다. 전진하려는 칸에 막이 있어도 비행선은 막을 뚫고 지나갈 수 있다. 이때는 비용 BB가 든다. 예를 들어 아래 그림은 (6,5)(6,5)에 있는 비행선이 (7,5)(7,5)로 전진하는 경우이다. (7,5)(7,5)에 막이 있으므로 비용 BB가 든다.

비행선이 터널을 완전히 통과하면 게임이 끝나며, 게임 스코어는 통과하는 동안 발생한 비용의 합이다. 스코어가 낮을수록 좋다. 게임을 시작할 때 비행선의 yy좌표는 비용 없이 고를 수 있고, 게임이 끝날 때 yy좌표는 어디여도 된다.

터널 크기와 막의 위치가 같더라도 비용 AA와 BB가 바뀌면 최소 스코어와 그 스코어를 얻는 움직임이 달라질 수 있다. 주어진 터널과 막의 위치를 이용해 AA와 BB가 바뀔 때마다 가능한 가장 낮은 게임 스코어를 구하도록 다음 두 함수를 구현해야 한다.

  • void init( int N, int M, std::vector<int> Y1, std::vector<int> Y2 ) ; 최초에 한 번만 호출된다. N과 M은 터널의 크기 N×MN \times M을 나타낸다. Y1과 Y2는 길이가 NN인 배열이다. (X,Y1)(X, Y_1)부터 (X,Y2)(X, Y_2)까지 막이 있다면 Y1[X]는 Y1Y_1, Y2[X]는 Y2Y_2이다.
  • long long minimize( int A, int B ) ; A는 순간이동 한 번의 비용, B는 막을 한 번 뚫는 비용이다. 터널을 통과하는 데 필요한 비용의 최솟값을 구해 반환한다.

제한

  • 1≤N≤10 0001 \le N \le 10\,000
  • 1≤M≤1091 \le M \le 10^9
  • 1≤Q≤1061 \le Q \le 10^6
  • 0≤Y1≤Y2≤M−10 \le Y_1 \le Y_2 \le M - 1
  • 0≤A,B≤1090 \le A, B \le 10^9

예제1

  1. 예제 1

    입력
    3 5 2
    2 4
    0 2
    1 3
    2 1
    3 5
    
    예상 출력
    1
    3