DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

괄호문자열 만들기

문제로 돌아가기

해설

처음 iii개 문자의 여는 괄호 수에서 닫는 괄호 수를 뺀 값을 SiS_iSi​라 하자. 구간 [l,r][l,r][l,r]이 올바른 괄호 문자열이라는 조건은

Sl−1=Sr,Sj≥Sl−1(l≤j≤r)S_{l-1}=S_r,\qquad S_j\geq S_{l-1}\quad(l\leq j\leq r)Sl−1​=Sr​,Sj​≥S

이다. 경계 0,…,N0,\ldots,N0,…,N을 정점으로 보고, 각 지정 구간의 두 경계 l−1,rl-1,rl−1,r을 DSU로 합친다.

서로 다른 집합의 경계가 x1<y1<x2<y2x_1<y_1<x_2<y_2x1​<y1​<x2​ 순서로 교차한다면 두 집합도 합친다. 이를 위해 경계를 왼쪽부터 훑으며 아직 마지막 경계에 도달하지 않은 집합들을 스택에 둔다. 집합이 다시 나타나면 그 위의 집합들을 모두 합치고, 마지막 경계에 도달한 집합은 스택에서 뺀다.

최종 집합마다 연속한 경계 사이의 구간을 만들면, 구간들은 서로 떨어져 있거나 포함 관계에 있다. 각 구간에서 바로 안쪽의 구간들을 제거하고 남은 위치들을 순서대로 묶는다. 각 묶음을 독립적으로 올바른 괄호 문자열로 만들면 된다. 어느 구간에도 속하지 않는 위치는 max⁡(ai,bi)\max(a_i,b_i)max(ai​,bi​)를 선택한다.

한 묶음의 길이를 2k2k2k라 하자. 모두 닫는 괄호로 두면 보상은 ∑bi\sum b_i∑bi​이고, 위치 iii를 여는 괄호로 바꿀 때의 이득은 ai−bia_i-b_ia이다. 왼쪽부터 이득을 최대 힙에 넣고, 묶음의 첫째·셋째·다섯째 위치마다 최댓값 하나를 꺼내 여는 괄호로 선택한다.

묶음들의 전체 크기는 NNN 이하이다. 시간 복잡도는 O((N+M)α(N)+Nlog⁡N)O((N+M)\alpha(N)+N\log N)O((N+M)α(N)+NlogN), 공간 복잡도는 O(N+M)O(N+M)이다. 는 역 아커만 함수이다.

증명

같은 DSU 집합의 경계들은 높이가 같다. 원래 구간들이 이어서 덮는 범위에서는 그 높이 아래로 내려갈 수 없으므로, 연속한 두 경계 사이도 올바른 괄호 문자열이어야 한다. 서로 다른 집합의 경계가 교차하면 접두사 조건에 의해 서로의 높이가 상대방 이상이어야 한다. 따라서 두 높이는 같고, 집합을 합쳐도 조건이 달라지지 않는다.

교차를 모두 없애면 구간들은 서로 떨어져 있거나 포함 관계에 있다. 올바른 괄호 문자열을 삽입하거나 제거해도 바깥 문자열의 올바름은 유지된다. 따라서 원래 조건은 각 구간에서 안쪽 구간을 제거한 묶음들을 독립적으로 올바르게 만드는 조건과 동치이다.

한 묶음의 처음 2j−12j-12j−1개 위치에는 여는 괄호가 적어도 jjj개 필요하다. 이전 탐욕 선택들을 포함하는 최적해에서, 이 접두사 안의 추가 선택 하나를 현재 힙의 최댓값으로 바꾸자. 앞선 접두사는 이전 선택들만으로 조건을 만족하고, 이후 접두사의 선택 수는 변하지 않으므로 보상이 줄지 않는 교환이다. 따라서 탐욕법이 최적이다.

l−1​
(
l
≤
j≤
r)
<
y2​
i
​
−
bi​
O(N+
M)
α\alphaα