Gym 100803G Flipping Parentheses
题意:给你一些匹配好的括号,长为n,有m个操作,每次操作把其中一个"("改为")",或者把其中一个")"改为"(",问你改动一个单括号,使得改后的括号序列任然完美匹配,如果有多种该法,求出最前面的。
思路:可以分两种情况分类讨论,先求出所有下标的前缀和,如果是第一种情况,那么只要从左到右找到第一个")"就行了,可以用set维护,如果是第二种情况,那么可以用线段树维护区间的最小值,然后用二分查找出最前面的一个大于等于2,且后面的前缀和的值都大于等于2的下标。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
#define maxn 300030
char s[maxn];
int sum[maxn];
#define inf 888888888
struct node{
int l,r,minx,add;
}b[4*maxn];
set<int>myset;
set<int>::iterator it;
void build(int l,int r,int i)
{
int mid;
b[i].l=l;b[i].r=r;b[i].add=0;
if(l==r){
b[i].minx=sum[l];
return;
}
mid=(l+r)/2;
build(l,mid,i*2);
build(mid+1,r,i*2+1);
b[i].minx=min(b[i*2].minx,b[i*2+1].minx);
}
void update(int l,int r,int add,int i)
{
int mid;
if(b[i].l==l && b[i].r==r){
b[i].add+=add;
b[i].minx+=add;
return;
}
if(b[i].add){
b[i*2].add+=b[i].add;
b[i*2].minx+=b[i].add;
b[i*2+1].add+=b[i].add;
b[i*2+1].minx+=b[i].add;
b[i].add=0;
}
mid=(b[i].l+b[i].r)/2;
if(r<=mid)update(l,r,add,i*2);
else if(l>mid)update(l,r,add,i*2+1);
else {
update(l,mid,add,i*2);
update(mid+1,r,add,i*2+1);
}
b[i].minx=min(b[i*2].minx,b[i*2+1].minx);
}
int question(int l,int r,int i)
{
int mid;
if(b[i].l==l && b[i].r==r){
return b[i].minx;
}
if(b[i].add){
b[i*2].add+=b[i].add;
b[i*2].minx+=b[i].add;
b[i*2+1].add+=b[i].add;
b[i*2+1].minx+=b[i].add;
b[i].add=0;
}
mid=(b[i].l+b[i].r)/2;
if(r<=mid)return question(l,r,i*2);
else if(l>mid)return question(l,r,i*2+1);
else {
return min(question(l,mid,i*2),question(mid+1,r,i*2+1) );
}
b[i].minx=min(b[i*2].minx,b[i*2+1].minx);
}
int main()
{
int n,m,i,j,c,l,r,mid;
while(scanf("%d%d",&n,&m)!=EOF)
{
scanf("%s",s+1);
sum[0]=0;
myset.clear();
for(i=1;i<=n;i++){
if(s[i]=='('){
sum[i]=sum[i-1]+1;
}
else{
sum[i]=sum[i-1]-1;
myset.insert(i);
}
}
build(1,n,1);
for(i=1;i<=m;i++){
scanf("%d",&c);
if(s[c]=='('){
s[c]=')';
myset.insert(c);
update(c,n,-2,1);
it=myset.begin();
cout<<*it<<endl;
myset.erase(it);
update(*it,n,2,1);
s[*it]='(';
}
else if(s[c]==')'){
s[c]='(';
myset.erase(c);
update(c,n,2,1);
l=1;r=n;
while(l<=r){
mid=(l+r)/2;
if(question(mid,n,1)>=2)r=mid-1;
else l=mid+1;
}
printf("%d\n",l);
s[l]=')';
update(l,n,-2,1);
myset.insert(l);
}
}
}
return 0;
}
Gym 100803G Flipping Parentheses的更多相关文章
- Codeforces Gym 100803G Flipping Parentheses 线段树+二分
Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...
- CSU - 1542 Flipping Parentheses (线段树)
CSU - 1542 Flipping Parentheses Time Limit: 5000MS Memory Limit: 262144KB 64bit IO Format: %lld ...
- CSUOJ 1542 Flipping Parentheses
ACM International Collegiate Programming Contest Asia Regional Contest, Tokyo, 2014–10–19 Problem G ...
- Flipping Parentheses~Gym 100803G
Description A string consisting only of parentheses '(' and ')' is called balanced if it is one of t ...
- Gym 101606F - Flipping Coins - [概率DP]
题目链接:https://codeforc.es/gym/101606/problem/F 题解: 假设 $f[i][j]$ 表示抛 $i$ 次硬币,有 $j$ 个硬币正面朝上的概率. 所以只有两种挑 ...
- Flipping Parentheses(CSU1542 线段树)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1542 赛后发现这套题是2014东京区域赛的题目,看了排名才发现自己有多low = =! 题目大意 ...
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest
2014-2015 ACM-ICPC, Asia Tokyo Regional Contest A B C D E F G H I J K O O O O O O A - Bit ...
- Codeforces Gym 100610 Problem A. Alien Communication Masterclass 构造
Problem A. Alien Communication Masterclass Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codefo ...
- Gym 101606 - A/B/C/D/E/F/G/H/I/J/K/L - (Undone)
链接:https://codeforces.com/gym/101606 A - Alien Sunset 暴力枚举小时即可. #include<bits/stdc++.h> using ...
随机推荐
- 一文带你学会AQS和并发工具类的关系
1. 存在的意义 AQS(AbstractQueuedSynchronizer)是JAVA中众多锁以及并发工具的基础,其底层采用乐观锁,大量使用了CAS操作, 并且在冲突时,采用自旋方式重试,以实 ...
- Java开发手册之安全规约
1.用户敏感数据禁止直接展示,必须对展示数据进行脱敏.例如手机号.银行卡号等,中间要用*隐藏. 2.发贴.评论.发送即时消息等用户生成内容的场景必须实现防刷.文本内容违禁词过滤等风控策略,一般是用验证 ...
- Java开发手册之编程规约
时隔一年多,再次开始更新博客,各位粉丝们久等了.大家是不是以为我像大多数开发者一样三分钟热度,坚持了一年半载就放弃了,其实不是.在过去的一年时间我学习了<Java编程思想>这本书,因为都是 ...
- Linux 服务器安装node环境
Linux 装 node 环境 我的是 CentOS 查看服务器是多少位系统 getconf LONG_BIT 下载地址, 下载对应的版本: http://nodejs.cn/download/ 我这 ...
- 【Java】Jsoup爬虫,一个简单获取京东商品信息的小Demo
简单记录 - Jsoup爬虫入门实战 数据问题?数据库获取,消息队列中获取中,都可以成为数据源,爬虫! 爬取数据:(获取请求返回的页面信息,筛选出我们想要的数据就可以了!) 我们经常需要分析HTML网 ...
- kafka(二)基本使用
一.Kafka线上集群部署方案 既然是集群,那必然就要有多个Kafka节点机器,因为只有单台机器构成的kafka伪集群只能用于日常测试之用,根本无法满足实际的线上生产需求. 操作系统: kafka由S ...
- HTML基础复习4
CSS的应用 模块的边框 设置边框样式 border-style::如果是一个值那么表示四个边的样式都一样:如果是两个值那么第一个值代表上下,第二个值代表左右:如果是三个值,第一个值代表上,第二个值代 ...
- JVM学习-运行时数据区域
目录 前言 运行时数据区 程序计数器 Java虚拟机栈 局部变量表 基础数据类型 对象引用 returnAddress 操作数栈 动态链接 方法返回地址 Java堆 方法区 类型信息 字段描述符 方法 ...
- Python赋值、浅复制和深复制
Python赋值.浅复制和深复制 首先我们需要知道赋值和浅复制的区别: 赋值和浅复制的区别 赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据.即赋值后,两 ...
- /bin/sh: cc: command not found
make的时候报错:/bin/sh: cc: command not found 解决: 1. sudo yum -y install gcc gcc-c++ libstdc++-devel 2. m ...