DOJ logoDOJ
题目
最近添加的题目收藏的题目
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 认证的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

Building Bracket Strings

返回题目

题解

처음 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α