给一个长度为 $n\,(1\le n\le 1000)$ 的正整数序列 $\left\lbrace c_n\right\rbrace \,(1\le c_i\le 10^9)$。用该序列一如下方式构造一个括号序列 $s$:
开始 $c$ 为空;
对 $i$ 从 $1$ 到 $n$ 依次遍历,若 $i$ 为奇数,则在 $s$ 后插入 $c_i$ 个
'('
,否则插入 $c_i$ 个')'
。
求有多少对 $\left<l,r\right>$ 使得 $s_{l\sim r}$ 为合法括号序列。
">Compressed Bracket Sequence
Compressed Bracket Sequence
Created by LXC on Mon Mar 4 15:55:52 2024
https://codeforces.com/problemset/problem/1556/C
ranting: 1800
tag: brute force, implementation
problem
给一个长度为 $n,(1\le n\le 1000)$ 的正整数序列 $\left\lbrace c_n\right\rbrace ,(1\le c_i\le 10^9)$。用该序列一如下方式构造一个括号序列 $s$:
- 开始 $c$ 为空;
- 对 $i$ 从 $1$ 到 $n$ 依次遍历,若 $i$ 为奇数,则在 $s$ 后插入 $c_i$ 个
'('
,否则插入 $c_i$ 个')'
。
求有多少对 $\left<l,r\right>$ 使得 $s_{l\sim r}$ 为合法括号序列。
solution
考虑以$c_i$作为左端点有多少合法的括号序列。
初始时至少有$min(c_i, c_{i+1})$对括号序列。当$c_i > c_{i+1}$,可以为后续填补$c_i-c_{i+1}$个左括号。
什么时候需要填补?$c_{j} < c_{j+1}$时,需要填补$c_{j+1}-c_{j}$个。可过程中存在$c_{j}>c_{j+1}$,也可以为后续填补左括号。所以需要维护一个左括号前缀和,当前真正缺的左括号数目还需要加上之前的左括号,然后再用$c_i > c_{i+1}$的左括号填补才能保证是以$c_i$作为开端的子串。
code
1 |
|