만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

Emacs++

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

요약
괄호 문자열에서 왼쪽, 오른쪽 이동과 짝 괄호로 이동하는 비용이 주어질 때, 각 질의의 최소 비용을 구해 합을 출력합니다.
난이도

보통10점 중 7점

유형
최단 경로, 그래프, 트리
정답자
아직 제출이 없습니다

문제

2016년 Distributed Code Jam에서 괄호를 촘촘하게 쓰는 Lisp 애호가를 위해 Lisp++ 언어를 소개했습니다. 문법을 다시 정리하면 다음과 같습니다.

Lisp++ 프로그램은 짝이 맞는 괄호 문자열입니다. 정확히는 다음 중 하나입니다. 이 명세에서 CC는 어떤 프로그램 코드든 뜻하며, 매번 같은 코드일 필요는 없습니다.

  • () 여는 괄호 하나와 닫는 괄호 하나입니다. 이 (와 )는 서로 짝을 이룹니다.
  • (CC) 프로그램을 한 쌍의 괄호로 감싼 것입니다. 이 (와 )는 서로 짝을 이룹니다.
  • CCCC 두 프로그램을 이어 붙인 것입니다. 두 프로그램은 같지 않아도 됩니다.

올해는 Lisp++용 텍스트 뷰어인 Emacs++를 발표합니다. Emacs++는 길이 KK인 Lisp++ 프로그램을 한 줄로 보여 주고, 사용자가 움직일 수 있는 커서를 함께 표시합니다. 커서는 블록 커서이며, 항상 KK개 문자 중 하나의 위에 놓입니다. 두 문자 사이에 놓이지 않습니다.

언제든지 다음 세 동작 중 하나로 커서를 움직일 수 있습니다. ii는 커서의 현재 위치이며, 가장 왼쪽 문자를 1번으로 셉니다.

  • 커서를 한 칸 왼쪽으로 옮깁니다. 이미 가장 왼쪽 문자에 있으면 아무 일도 일어나지 않습니다. 소요 시간은 LiL_i초입니다.
  • 커서를 한 칸 오른쪽으로 옮깁니다. 이미 가장 오른쪽 문자에 있으면 아무 일도 일어나지 않습니다. 소요 시간은 RiR_i초입니다.
  • 커서를 ii번째 문자와 짝을 이루는 괄호 위치로 순간 이동합니다. 소요 시간은 PiP_i초입니다.

Emacs++가 얼마나 효율적인지 알아볼 필요가 있습니다. 프로그램은 하나이고, 그 프로그램에 대한 QQ개의 질의가 있습니다. 각 질의는 시작 위치 SjS_j와 끝 위치 EjE_j로 이루어집니다. jj번째 질의마다, 최적의 선택을 했을 때 커서를 SjS_j에서 EjE_j로 옮기는 데 드는 가장 짧은 시간 NjN_j(초)를 구하십시오.

모든 NjN_j의 합을 출력하십시오.

입력

첫 줄에는 테스트 케이스의 개수 TT가 주어집니다. 이어서 테스트 케이스가 나옵니다.

각 테스트 케이스의 첫 줄에는 Lisp++ 프로그램의 길이 KK와 질의의 개수 QQ가 정수로 주어집니다.

둘째 줄에는 길이 KK의 문자열 PP가 주어집니다. 각 문자는 ( 또는 )이며, 짝이 맞는 Lisp++ 프로그램을 나타냅니다.

셋째, 넷째, 다섯째 줄에는 각각 KK개의 정수가 주어집니다. 이 줄들의 ii번째 정수는 각각 LiL_i, RiR_i, PiP_i입니다.

여섯째 줄과 일곱째 줄에는 각각 QQ개의 정수가 주어집니다. jj번째 정수는 각각 SjS_j와 EjE_j입니다.

출력

각 테스트 케이스마다 Case #x: y 형식으로 한 줄을 출력합니다. 여기서 xx는 1부터 세는 테스트 케이스 번호이고, yy는 모든 NjN_j의 합입니다.

제한

  • 1≤T≤1001 \le T \le 100
  • K=105K = 10^5이고 Q=105Q = 10^5인 테스트 케이스는 최대 9개입니다.
  • 그 밖의 모든 경우에는 2≤K≤10002 \le K \le 1000이고 1≤Q≤10001 \le Q \le 1000입니다.
  • PP의 길이는 KK이며, PP는 위에서 설명한 짝이 맞는 괄호 문자열입니다.
  • 모든 jj에 대해 1≤Sj≤K1 \le S_j \le K입니다.
  • 모든 jj에 대해 1≤Ej≤K1 \le E_j \le K입니다.

힌트

테스트 세트 1의 제한을 따르는 예시에서는 모든 이동이 1초씩 걸립니다. 질의별 최단 시간은 다음과 같습니다.

  1. 7에서 12까지 오른쪽으로 다섯 번 이동하며, 5초가 걸립니다.
  2. 4에서 11로 순간 이동하며, 1초가 걸립니다.
  3. 4에서 11로 순간 이동한 뒤 10까지 왼쪽으로 이동하며, 2초가 걸립니다.
  4. 12에서 1로 순간 이동하며, 1초가 걸립니다.
  5. 5에서 6으로 오른쪽으로 이동하며, 1초가 걸립니다.

질의 시간의 합은 5 + 1 + 2 + 1 + 1 = 10초입니다.

예제1

  1. 예제 1

    입력
    1
    12 5
    (()(((()))))
    1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1
    7 4 4 12 5
    12 11 10 1 6
    
    예상 출력
    Case #1: 10