CSU - 1542

Time Limit: 5000MS   Memory Limit: 262144KB   64bit IO Format: %lld & %llu

Submit Status

Description

Input

Output

Sample Input

6 3
((()))
4
3
1

Sample Output

2
2
1

Hint

题意:先给出一个符合括号匹配的字符串。然后Q次操作

每次操作将某个括号反转,问将哪个括号反转能使字符串的括号再次匹配,位置要取最左端符合条件的。

能够利用前缀和 比方(())那么前缀和分别就是1,2,1,0。观察到。平衡时前缀和都是等于0的。

通过前缀和,我们能够发现规律:

将一个'('翻转成')'会使得从当前位置開始到字符串最后的前缀和都会减2

假设将')'翻转成'(',同理,此位置開始以后的全部前缀和都要加2

而假设减去了2,那怎样添加2抵消掉之前的影响,得到最后的后缀和为零

而减去2的话肯定是'('翻转成')'。那么怎样加一个数抵消掉')'的影响

假设是将p点翻转的话,肯定是从[1,p],找一个')',将')'翻转成'('

有没有发现规律,假设是'('翻转成')',则是在之前的区间将')'翻转成'('。那么将')'翻转成'('时,就是往后,找一个'('将其'('翻转成')'

维护该区间的最小值就可以。仅仅要最小值不小于2,那么该区间的全部值都不会小于2

提供一个朋友的具体解释地址,说的非常好:http://blog.csdn.net/qwb492859377/article/details/47357553

/*
Author: 2486
Memory: 32700 KB Time: 760 MS
Language: C++ Result: Accepted
VJ RunId: 4340427 Real RunId: 149963
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue> using namespace std;
#define lson rt << 1, l, mid
#define rson rt << 1|1, mid + 1, r
#define root 1, 1, n
const int MAXN = 5e5 + 5;
const int INF = 0x3f3f3f3f; int sum[MAXN << 2];
int Min[MAXN << 2],col[MAXN << 2],val[MAXN << 2];
int S,n,m;
char str[MAXN]; void pushup_1(int rt) {
sum[rt] = min(sum[rt << 1], sum[rt << 1|1]);
} void build(int rt, int l, int r) {
col[rt] = 0;
if(l == r) {
val[rt] = (str[l] == '(' ? 1 : -1);
S += val[rt];
Min[rt] = S;
sum[rt] = val[rt] == 1 ? INF : l;
return;
}
int mid = (l + r) >> 1;
build(lson);
build(rson);
pushup_1(rt);
Min[rt] = min(Min[rt << 1], Min[rt << 1|1]);
} int update_1(int p, int rt, int l, int r) {
if(l == r) {
int tmp = val[rt];
val[rt] *= -1;
sum[rt] = tmp == 1 ? p : INF;
return tmp;
}
int mid = (l + r) >> 1, ret;
if(p <= mid) ret = update_1(p, lson);
if(p > mid) ret = update_1(p, rson);
pushup_1(rt);
return ret;
}
void pushdown(int rt) {
if(col[rt]) {
col[rt << 1] += col[rt];
col[rt << 1|1] += col[rt];
col[rt] = 0;
}
} void pushup_2(int rt) {
Min[rt] = min(Min[rt << 1] + col[rt << 1], Min[rt << 1|1] + col[rt << 1|1]);
} void update_2(int L, int R, int c,int rt, int l, int r) {
if(L <= l && r <= R) {
col[rt] += c;
return;
}
pushdown(rt);
int mid = (l + r) >> 1;
if(L <= mid) update_2(L, R, c, lson);
if(R > mid) update_2(L, R, c, rson);
pushup_2(rt);
} int query(int rt, int l,int r) {
if(Min[rt] + col[rt] >= 2) return l;
if(l == r) return r + 1;
pushdown(rt);
int mid = (l + r) >> 1;
int ret;
if(Min[rt << 1|1] + col[rt << 1|1] >= 2) ret = query(lson);
else ret = query(rson);
pushup_2(rt);
return ret;
} int main() {
int p;
while(~scanf("%d %d",&n,&m)) {
scanf("%s",str+1);
S = 0;
build(root);
while(m--) {
scanf("%d",&p);
int tmp = update_1(p, root);
update_2(p, n, tmp * (-2), root);
printf("%d\n",p = (tmp == 1 ? sum[1] : query(root)));
update_1(p, root);
update_2(p, n, tmp * 2, root);
}
}
return 0;
}

CSU - 1542 Flipping Parentheses (线段树)的更多相关文章

  1. Codeforces Gym 100803G Flipping Parentheses 线段树+二分

    Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...

  2. CSUOJ 1542 Flipping Parentheses

    ACM International Collegiate Programming Contest Asia Regional Contest, Tokyo, 2014–10–19 Problem G ...

  3. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. CSU 1809 Parenthesis(线段树+前缀和)

    Parenthesis Problem Description: Bobo has a balanced parenthesis sequence P=p1 p2-pn of length n and ...

  5. POJ 1542 Atlantis(线段树 面积 并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 参考网址:http://blog.csdn.net/sunmenggmail/article/d ...

  6. HDU - 1542 扫描线入门+线段树离散化

    扫描线算法+线段树维护简介: 像这种求面积的并集的题目,就适合用扫描线算法解决,具体来说就是这样 类似这种给出点的矩形的对角的点的坐标,然后求出所有矩形面积的交集的问题,可以采用扫描线算法解决.图如下 ...

  7. 【42.49%】【hdu 1542】Atlantis(线段树扫描线简析)

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...

  8. HDU - 1542 Atlantis(线段树求面积并)

    https://cn.vjudge.net/problem/HDU-1542 题意 求矩形的面积并 分析 点为浮点数,需要离散化处理. 给定一个矩形的左下角坐标和右上角坐标分别为:(x1,y1).(x ...

  9. CSU 1809 Parenthesis 思维+线段树

    1809: Parenthesis Submit Page     Summary    Time Limit: 5 Sec     Memory Limit: 128 Mb     Submitte ...

随机推荐

  1. [洛谷P3805]【模板】manacher算法

    题目大意:给你一个字符串,求出它的最长回文字段 题解:$manacher$算法 卡点:$p$数组未开两倍空间 C++ Code: #include <cstdio> #include &l ...

  2. [bzoj] 2716 天使玩偶 || CDQ分治

    原题 已知n个点有天使玩偶,有m次操作: 操作1:想起来某个位置有一个天使玩偶 操作2:询问离当前点最近的天使玩偶的曼哈顿距离 显然的CDQ问题,三维分别为时间,x轴,y轴. 但是这道题的问题在于最近 ...

  3. BZOJ4825 [Hnoi2017]单旋 【线段树】

    题目链接 BZOJ4825 题解 手模一下操作,会发现一些很优美的性质: 每次旋到根,只有其子树深度不变,剩余点深度\(+1\) 每次旋到根,[最小值为例]右儿子接到其父亲的左儿子,其余点形态不改变, ...

  4. CSS实现放大镜/狙击镜效果

    图片放大,这是一个比较容易的效果了.当然,今天说的可不是简简单单的在一个框里放大,而是一个圆.就像放大镜或是狙击镜那样,只有圆圈里的放大,圈外的当然还是原来的图片.这是不是很不可思议? 当然不是.做过 ...

  5. Java面试题之类的静态代码块和静态属性等的加载顺序

    如以下面试题: /** * @author hjs * @date 2019/3/62:41 * @Dec */public class B { public static B t1 = new B( ...

  6. HTTP协议中GET、POST和HEAD的介绍

    HTTP协议中GET.POST和HEAD的介绍 GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体 ...

  7. bzoj1382 1935: [Shoi2007]Tree 园丁的烦恼

    1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec  Memory Limit: 357 MBSubmit: 1261  Solved: 578[Submit] ...

  8. matlab 分析wav波形

    [x,fs,bits]=wavread('d.wav', [1 5000]); % sound(x, fs, bits); N = length(x); n = 0 : N-1; t = n/fs; ...

  9. python 二分法查找思考理解小白向け

    首先说一下二分法查找的思路.这是面向小白的课程,大佬请让步谢谢 给定一个有序的序列(必须是排好序的)例如[1,2,3,4,5,6,7,8,9,10,20,30,400],然后我们查询一个元素出现的坐标 ...

  10. log4j配置文件动态指定日志文件名称

    我们在项目当中经常会使用log4j进行日志记录,偶尔会遇到一些要求,比如日志文件名称按照启动参数动态配置,而不去修改log4j.xml,比较简单的一种做法是,通过设置系统属性的方式实现,代码: if( ...