백준 문제풀이

백준 20052 - 괄호 문자열 ? [Python]

Vermeil 2022. 4. 9. 03:13

https://www.acmicpc.net/problem/20052

 

20052번: 괄호 문자열 ?

괄호 문자열은 '('와 ')'로 이루어진 문자열이고, 올바른 괄호 문자열은 다음과 같이 정의된다. 빈 문자열은 올바른 괄호 문자열이다. S가 올바른 괄호 문자열일 때, (S)도 올바른 괄호 문자열이

www.acmicpc.net

 

 

L~R까지의 합이 0이면 된다. 누적합과 세그트리를 사용하자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import sys
input = sys.stdin.readline
 
INF = 10 ** 7
 
seg = [0 for _ in range(404040)]
= [0 for _ in range(101010)]
 
def init(x, s, e):
    if s == e:
        seg[x] = p[s]
        return seg[x]
    mid = (s + e) // 2
    seg[x] = min(init(x * 2, s, mid), init(x * 2 + 1, mid + 1, e))
    return seg[x]
 
def getMin(x, s, e, l, r):
    if e < l or r < s:
        return INF
    if l <= s and e <= r:
        return seg[x]
    mid = (s + e) // 2
    return min(getMin(x * 2, s, mid, l, r), getMin(x * 2 + 1, mid + 1, e, l, r))
 
= str((input().rstrip()))
for i in range(len(s)):
    p[i + 1= p[i] + (1 if s[i] == '(' else -1)
 
init(11len(s))
 
= int(input())
ans = 0
for queries in range(m):
    i, j = map(int, input().split())
    if getMin(11len(s), i, j) == p[i - 1and p[j] == p[i - 1]:
        ans += 1
print(ans)
cs