C. Compressed Bracket Sequence | Deltix Round Summer 2021 Div.1 + Div2
7991 ワード
https://codeforces.com/contest/1556/problem/C
1秒、256 MBメモリ
input : t (1 ≤ t ≤ 1000) c1, c2, …, cn (1 ≤ ci ≤ 109) output : Output a single integer — the total number of subsegments of the original bracket sequence, which are regular bracket sequences.
正しいかっこを生成できる個数を出力してください. 条件:
かっこをそのまま表示すると、大きすぎるので数字で入力します.単数索引は「(」の個数を表し、偶数索引は「)」の個数を表す.
連続部分配列で作成できるすべての正しいかっこ数を計算します.
時間がかかりすぎた.実は今はまだ難しい
まず、前から後ろにカッコをすべて作成することを考慮します.移動には時間がかかるだけでなく、漏れが多く発生します.
現在を基準に、以前に作成したカッコをチェックすると便利です.
まずかっこを確認するときはペアで確認します
これにより、このときに作成できる正しいかっこの個数を決定できます.この場合、2つのケースがあります.
かっこが個以上残っている場合は、->右かっこの数が正しいかっこになります. の括弧が前の左括弧と一致する場合->現在の残りの左括弧+右括弧-最初の括弧が閉じたときの残りの左括弧数 スタック初期化
1秒、256 MBメモリ
input :
正しいかっこを生成できる個数を出力してください.
かっこをそのまま表示すると、大きすぎるので数字で入力します.単数索引は「(」の個数を表し、偶数索引は「)」の個数を表す.
連続部分配列で作成できるすべての正しいかっこ数を計算します.
まず、前から後ろにカッコをすべて作成することを考慮します.移動には時間がかかるだけでなく、漏れが多く発生します.
現在を基準に、以前に作成したカッコをチェックすると便利です.
まずかっこを確認するときはペアで確認します
これにより、このときに作成できる正しいかっこの個数を決定できます.この場合、2つのケースがあります.
かっこが
スタック初期化
スタックを最初に作成するときは、[0,0]を格納します.これまでカッコがなかったためです.
[0]前の左かっこの個数
[1]の2番目のオプションは、このカッコを付けて正しい式を生成できる数を格納します.
では、文の回転を繰り返すと、残りの左かっこの数はopne-clossの数で計算できます.
この時は負数でも放っておく負数については,閉じた後に新たな括弧を付けることはできないと考えられる.
すなわち,新しい括弧が必要であり,[cur open,0]が追加される.
前のかっこを現在の条件で貼り付けます
これで、以前に存在したカッコが決定されると、前の[0]はcur openより大きい.
右括弧が増えたからといって、それを埋め尽くしたのです.
したがって、このカッコで増加した値を正解に追加します.
同じ値なら?
追加を続行できますOpen、closeが同じで、後ろのカッコも同じであれば、この2つを追加することで2つの正しいカッコを作成することができますので、この場合も考慮してください.
新しいかっこ
以前に存在したカッコにカッコを付けることはできません->スタックが空です.新規作成
上記でない場合は[cur open,1]を追加します.現在開いているかっこの数を記録し、比較します.
上から右かっこで数える.これから.
現在のかっこを作成するときは、前に保持したかっこが含まれていることを確認します.
次に、他のコンテンツを検索するときにスタックをループして、カッコ自体を追加できるかどうかを確認できます.import sys
n = int(sys.stdin.readline())
data = list(map(int, sys.stdin.readline().split()))
ans, cur_open = 0, 0
s = [[0, 0]]
for i in range(0, n, 2):
if i + 1 >= n:
continue
open_bracket = data[i]
close_bracket = data[i + 1]
cur_open += open_bracket - close_bracket
ans += min(close_bracket, cur_open + close_bracket - s[0][0])
while s and s[-1][0] > cur_open:
ans += s[-1][1]
s.pop()
if s and s[-1][0] == cur_open:
ans += s[-1][1]
s[-1][1] += 1
else:
if s:
s.append([cur_open, 1])
else:
s.append([cur_open, 0])
print(ans)
Reference
この問題について(C. Compressed Bracket Sequence | Deltix Round Summer 2021 Div.1 + Div2), 我々は、より多くの情報をここで見つけました
https://velog.io/@jsin2475/C.-Compressed-Bracket-Sequence-Deltix-Round-Summer-2021-Div.1-Div2
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
これで、以前に存在したカッコが決定されると、前の[0]はcur openより大きい.
右括弧が増えたからといって、それを埋め尽くしたのです.
したがって、このカッコで増加した値を正解に追加します.
同じ値なら?
追加を続行できますOpen、closeが同じで、後ろのカッコも同じであれば、この2つを追加することで2つの正しいカッコを作成することができますので、この場合も考慮してください.
新しいかっこ
以前に存在したカッコにカッコを付けることはできません->スタックが空です.新規作成
上記でない場合は[cur open,1]を追加します.現在開いているかっこの数を記録し、比較します.
上から右かっこで数える.これから.
現在のかっこを作成するときは、前に保持したかっこが含まれていることを確認します.
次に、他のコンテンツを検索するときにスタックをループして、カッコ自体を追加できるかどうかを確認できます.import sys
n = int(sys.stdin.readline())
data = list(map(int, sys.stdin.readline().split()))
ans, cur_open = 0, 0
s = [[0, 0]]
for i in range(0, n, 2):
if i + 1 >= n:
continue
open_bracket = data[i]
close_bracket = data[i + 1]
cur_open += open_bracket - close_bracket
ans += min(close_bracket, cur_open + close_bracket - s[0][0])
while s and s[-1][0] > cur_open:
ans += s[-1][1]
s.pop()
if s and s[-1][0] == cur_open:
ans += s[-1][1]
s[-1][1] += 1
else:
if s:
s.append([cur_open, 1])
else:
s.append([cur_open, 0])
print(ans)
Reference
この問題について(C. Compressed Bracket Sequence | Deltix Round Summer 2021 Div.1 + Div2), 我々は、より多くの情報をここで見つけました
https://velog.io/@jsin2475/C.-Compressed-Bracket-Sequence-Deltix-Round-Summer-2021-Div.1-Div2
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import sys
n = int(sys.stdin.readline())
data = list(map(int, sys.stdin.readline().split()))
ans, cur_open = 0, 0
s = [[0, 0]]
for i in range(0, n, 2):
if i + 1 >= n:
continue
open_bracket = data[i]
close_bracket = data[i + 1]
cur_open += open_bracket - close_bracket
ans += min(close_bracket, cur_open + close_bracket - s[0][0])
while s and s[-1][0] > cur_open:
ans += s[-1][1]
s.pop()
if s and s[-1][0] == cur_open:
ans += s[-1][1]
s[-1][1] += 1
else:
if s:
s.append([cur_open, 1])
else:
s.append([cur_open, 0])
print(ans)
Reference
この問題について(C. Compressed Bracket Sequence | Deltix Round Summer 2021 Div.1 + Div2), 我々は、より多くの情報をここで見つけました https://velog.io/@jsin2475/C.-Compressed-Bracket-Sequence-Deltix-Round-Summer-2021-Div.1-Div2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol