EVERYTHING HAPPENS FOR THE BEST|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-05-17 18:05阅读: 28评论: 0推荐: 0

CF1095E Almost Regular Bracket Sequence 题解

Almost Regular Bracket Sequence

题意

有一个长度为 n 的括号序列。

求有多少个位置使得改变了该位置的括号种类可以使得括号序列合法。

思路

令左括号为 1,右括号为 1,且这个序列所有数之和为 x

首先分为三种情况。

  1. x=2,那么说明左括号多了一个(一个右括号变一个左括号会使得 x 减少 2),要选择一个左括号变成右括号。
  2. x=2,那么说明右括号多了一个,要选择一个右括号变成左括号。
  3. x<2x>22<x<2,答案必将为 0,可以直接输出。

对于情况一

设前 i 个括号序列的和为 sumi

首先,我们来观察一个图:

在这种情况里,虽然 x=2,但是仍然没有答案。Why?

合法的括号序列,有一个条件,那就是在任何时候,左括号的数量都不能比右括号少

所以,我们可以推出第一个条件:

  • 可以作为答案的位置 i 必然要满足 1j<i(sumj0)=i1

那么,当我们第一次发现 sumi1<0 时,就可以退出找答案的循环了,后面的所有位置均不可成为答案。

再来观察一个图:

位置 2 和位置 3 给答案有贡献,那为啥位置 1 没有贡献呢?

虽然我们知道,位置 1 一旦变化,就会出现 sum1=1 的情况,可究竟怎样筛掉这些情况呢?

手推一下,我们会发现:把位置 i 上的左括号变为右括号,会使得 sumj2 (ji)

那么就好办了,只要 minijn{sumj}2 且位置 i 为左括号,这个位置即可对答案产生贡献。

对于情况二

同理,只要 minijn{sumj}2 且位置 i 为右括号,这个位置即可对答案产生贡献。

总结

  • 如果 |x|2,答案必为 0
  • 如果 x=2,答案为满足要求的 i 的个数。
    • si=(
    • 1j<i(sumj0)=i1minijn{sumj}2
  • 如果 x=2,答案为满足要求的 i 的个数。
    • si=)
    • 1j<i(sumj0)=i1minijn{sumj}2

用前缀和思想处理出 sum 数组,再求一遍 sum 的后缀最小值,统计答案即可。

Code

点击查看代码
#include <iostream>
#include <string>
using namespace std;
const int N = 1e6 + 10;
string s;
int n, sum[N], mi[N], ans; // sum 为前缀和,mi 为 sum 的后缀最小值
int main () {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> s;
for (int i = 1; i <= n; i++) {
sum[i] = sum[i - 1];
if (s[i - 1] == '(') { // 处理好前缀和
sum[i]++;
} else {
sum[i]--;
}
}
mi[n] = sum[n];
for (int i = n - 1; i; i--) { // 处理后缀最小值
mi[i] = min(mi[i + 1], sum[i]);
}
for (int i = 1; i <= n; i++) {
if (sum[n] == 2 && mi[i] >= 2 && s[i - 1] == '(') { // 判断,情况 1
ans++;
} else if (sum[n] == -2 && mi[i] >= -2 && s[i - 1] == ')') { // 判断,情况 2
ans++;
}
if (sum[i] < 0) { // 处理 i + 1 时,sum[i] < 0,结束循环
break;
}
}
cout << ans;
return 0;
}

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/17409624.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(28)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
平凡之路 (Live版) - 朴树
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 朴树/韩寒

作曲 : 朴树

编曲 : 朴树

徘徊着的 在路上的

你要走吗 via via

易碎的 骄傲着

那也曾是我的模样

沸腾着的 不安着的

你要去哪 via via

谜一样的 沉默着的

故事你真的在听吗

我曾经跨过山和大海

也穿过人山人海

我曾经拥有着的一切

转眼都飘散如烟

我曾经失落失望失掉所有方向

直到看见平凡才是唯一的答案

当你仍然

还在幻想

你的明天 via via

她会好吗 还是更烂

对我而言是另一天

我曾经毁了我的一切

只想永远地离开

我曾经堕入无边黑暗

想挣扎无法自拔

我曾经像你像他像那野草野花

绝望着也渴望着

也哭也笑平凡着

jia do

la so

哦~

向前走 就这么走

就算你被给过什么

向前走 就这么走

就算你被夺走什么

向前走 就这么走

就算你会错过什么

向前走 就这么走

就算你会

我曾经跨过山和大海

也穿过人山人海

我曾经拥有着的一切

转眼都飘散如烟

我曾经失落失望失掉所有方向

直到看见平凡才是唯一的答案

我曾经毁了我的一切

只想永远地离开

我曾经堕入无边黑暗

想挣扎无法自拔

我曾经像你像他像那野草野花

绝望着 渴望着 也哭也笑平凡着

我曾经跨过山和大海

也穿过人山人海

我曾经问遍整个世界

从来没得到答案

我不过像你像他像那野草野花

冥冥中这是我 唯一要走的路啊

时间如烟

如此这般

明天已在 via via

风吹过的 路依然远

你的故事讲到了哪

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示