Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence(思维)
题意:
给你一个只包含 '(' 和 ')' 的长度为 n 字符序列s;
给出一个操作:将第 i 个位置的字符反转('(' ')' 互换);
问有多少位置反转后,可以使得字符串 s 变为"Regular Bracket Sequence";
输出满足条件的位置的个数;
题解:
令 '(' = 1 , ')' = -1;
定义 sum[i]:括号序列的前缀和;
一个合法的括号匹配串的充要条件是:
[1] 对于任何 i,sum[i] ≥ 0;
[2] sum[n]=0;
int n;
char s[maxn];
int sum[maxn];///前缀和
int a[maxn];///a[i]:min{sum[1,..,i]}
int b[maxn];///b[i]:min{sum[i,..,n]}
枚举位置 i,判断将位置 i 反转后序列是否变为 "Regular Bracket Sequence";
///i位置反转只会影响[i,n]的sum值
///首先要确保[1,i-1]序列满足条件[1]
///接着判断将i位置反转后
///①sum[n]±2是否为0
///②b[i]±2是否≥0
bool isSat(int i)///判断i位置反转后序列是否可以变为RBS
{
if(a[i-] < )
return false;
if(s[i] == ')')
return b[i]+ >= && sum[n]+ == ? true:false;
else
return b[i]- >= && sum[n]- == ? true:false;
}
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=1e6+; int n;
char s[maxn];
int sum[maxn];
int a[maxn];
int b[maxn]; ///i位置反转只会影响[i,n]的sum值
///首先要确保[1,i-1]序列满足条件[1]
///接着判断将i位置反转后
///①sum[n]±2是否为0
///②b[i]±2是否≥0
bool isSat(int i)///判断i位置反转后序列是否可以变为RBS
{
if(a[i-] < )///[1,i-1]不满足条件[1]
return false;
if(s[i] == '(')///'('变为')' i及其之后的sum-2
return b[i]- >= && sum[n]- == ? true:false;
else
return b[i]+ >= && sum[n]+ == ? true:false;
}
int Solve()
{
sum[]=;
for(int i=;i <= n;++i)
sum[i]=sum[i-]+(s[i] == '(' ? :-); a[]=INF;
for(int i=;i <= n;++i)
a[i]=min(sum[i],a[i-]);
b[n+]=INF;
for(int i=n;i >= ;--i)
b[i]=min(sum[i],b[i+]); int ans=;
for(int i=;i <= n;++i)
if(isSat(i))
ans++; return ans;
}
int main()
{
scanf("%d%s",&n,s+);
printf("%d\n",Solve()); return ;
}
Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence(思维)的更多相关文章
- Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维,模拟栈)
题意:给你一串括号,每次仅可以修改一个位置,问有多少位置仅修改一次后所有括号合法. 题解:我们用栈来将这串括号进行匹配,每成功匹配一对就将它们消去,因为题目要求仅修改一处使得所有括号合法,所以栈中最后 ...
- Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维)
Codeforces Round #529 (Div. 3) 题目传送门 题意: 给你由左右括号组成的字符串,问你有多少处括号翻转过来是合法的序列 思路: 这么考虑: 如果是左括号 1)整个序列左括号 ...
- Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence 栈
C. Replace To Make Regular Bracket Sequence 题目连接: http://www.codeforces.com/contest/612/problem/C De ...
- Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence
题目链接:http://codeforces.com/contest/612/problem/C 解题思路: 题意就是要求判断这个序列是否为RBS,每个开都要有一个和它对应的关,如:<()> ...
- # Codeforces Round #529(Div.3)个人题解
Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...
- CodeForces Round #529 Div.3
http://codeforces.com/contest/1095 A. Repeating Cipher #include <bits/stdc++.h> using namespac ...
- Codeforces Round #529 (Div. 3) 题解
生病康复中,心情很不好,下午回苏州. 刷了一套题散散心,Div 3,全部是 1 A,感觉比以前慢了好多好多啊. 这几天也整理了一下自己要做的事情,工作上要努力... ... 晚上还是要认认真真背英语的 ...
- Codeforces Round #556 (Div. 2) - C. Prefix Sum Primes(思维)
Problem Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 1000 mSec Problem Descripti ...
- Codeforces Round #529 (Div. 3) C. Powers Of Two
http://codeforces.com/contest/1095/problem/C 题意:给n找出k个2的幂,加起来正好等于n.例如 9,4:9 = 1 + 2 + 2 + 4 思路:首先任何数 ...
随机推荐
- oracle默认日期格式
有关 Oracle 数据库中支持的语言的完整列表,以及与区域设置相关的信息细节,请参阅 Oracle Database Globalization Support Guide. 默认日期格式 小时.日 ...
- 洛谷 P1016 旅行家的预算 模拟+贪心
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1016 旅行家的预算 题目描述 一个旅行家想驾驶汽车 ...
- Leetcode892.Surface Area of 3D Shapes三维形体的表面积
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上. 返回结果形体的总表面积. 示例 1: ...
- 【水滴石穿】rn_antd_dva_reactnavigation
这个项目好像就是记录了一个数据的流向,大体思想好像是这个 项目地址:https://github.com/Yangzhuren/rn_antd_dva_reactnavigation 先看效果 第一个 ...
- Ubuntu中NS2安装详细教程
前言: NS2是指 Network Simulator version 2,NS(Network Simulator) 是一种针对网络技术的源代码公开的.免费的软件模拟平台,研究人员使用它可以很容易的 ...
- Linux的登录和退出
Linux是一个多用户的操作系统,用户要使用该系统,首先必须登录系统,使用完系统后,必须退出系统. 本章主要讨论登录和退出系统的方法: 用户登录系统时,为了使系统能够识别自己,必须输入用户名和密码,经 ...
- Directx11教程(16) D3D11管线(5)
原文:Directx11教程(16) D3D11管线(5) 本章我们学习VS中具体做些什么事情? 首先再看看我们的VS shader代码: Clolor.vs - PixelInputType Col ...
- More Effective C++: 03异常
C++的异常机制使得程序付出某些代价:资源泄漏的可能性增加了:写出具有你希望的行为的构造函数与析构函数变得更加困难:执行程序和库程序尺寸增加了,同时运行速度降低了等等. 但是为什么使用异常呢?C程序使 ...
- Linux使用注意事项
1.Linux严格区分大小写 2.Linux中所有内容以文件形式保存,包括硬件 3.修改任何设置,若想永久生效,都需要修改配置文件(除非某些发现版已经默认设置为同时修改内存和硬盘数据). 4.Linu ...
- lower_bounder()和upper_bound()的函数
lower_bound() .upper_bound()都运用于有序区间的二分查找. ForwardIter lower_bound(ForwardIter first, ForwardIter la ...