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

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

웜뱃

시간 제한20초메모리 제한256 MB

요약
R행 C열 격자에서 도로 구간의 늑대 수가 바뀔 때마다 맨 위 교차점에서 지정한 맨 아래 교차점까지 가는 경로의 늑대 수 최솟값을 구합니다.
난이도

어려움10점 중 8점

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

문제

브리즈번 시는 돌연변이로 거대해진 웜뱃(호주에 사는 너구리와 비슷한 동물)에게 점령당했다. 당신의 임무는 사람들을 구조하는 것이다.

브리즈번 시의 도로는 큰 격자 모양이다. 동서 방향의 수평 도로가 RR개 있고, 북쪽에서 남쪽으로 0번부터 R−1R-1번까지 번호가 매겨져 있다. 남북 방향의 수직 도로는 CC개 있고, 서쪽에서 동쪽으로 0번부터 C−1C-1번까지 번호가 매겨져 있다. 다음 그림은 이렇게 번호가 매겨진 도로의 예이다.

웜뱃은 북쪽에서 쳐들어오고, 사람들은 남쪽으로 도망친다. 사람들은 가로 방향으로는 어느 쪽으로든 움직일 수 있지만, 세로 방향으로는 안전한 남쪽으로만 움직일 수 있다.

수평 도로 PP와 수직 도로 QQ의 교차로는 (P,Q)(P, Q)로 나타낸다. 두 교차로 사이의 도로 구간에는 웜뱃이 있을 수 있으며, 구간마다 웜뱃의 수는 시간에 따라 변할 수 있다. 당신의 임무는 북쪽 수평 도로 0번의 주어진 교차로에 도착한 사람을, 남쪽 수평 도로 R−1R-1번의 주어진 교차로까지 보내는 경로를 알려주는 것이다. 이 경로는 가능한 한 적은 수의 웜뱃을 만나야 한다.

먼저 격자의 크기와 각 도로 구간에 있는 웜뱃의 수가 주어진다. 이후 EE개의 이벤트가 차례로 주어지며, 각 이벤트는 다음 두 가지 중 하나이다.

  • change: 어떤 도로 구간에 있는 웜뱃의 수가 바뀐다.
  • escape: 사람 한 명이 북쪽 수평 도로 0번의 주어진 교차로에 도착한다. 이 사람을 가장 적은 수의 웜뱃을 만나며 남쪽 수평 도로 R−1R-1번의 주어진 교차로까지 보내는 경로를 구해야 한다.

이벤트는 다음과 같이 정의된 함수 init(), changeH(), changeV(), escape()로 처리해야 한다.

제한

  • 2≤R≤50002 \le R \le 5000
  • 1≤C≤2001 \le C \le 200
  • change는 최대 500번 (changeH() 또는 changeV() 호출)이다.
  • escape()는 최대 200,000번 호출된다.
  • 한 구간에 있는 웜뱃의 수는 항상 1,000 이하이다.

예제1

  1. 예제 1

    입력
    2 1
    
    
    3
    1
    escape 0 0
    
    예상 출력
    3