2014-2015 ACM-ICPC, Asia Tokyo Regional Contest G題 (线段树区间更新)
来源:互联网 发布:mac键盘大写灯不亮 编辑:程序博客网 时间:2024/06/04 00:47
题目大意:
给一个括号序列,刚开始一定是平衡的(也就是括号都匹配)。现在改变其中某一个括号,然后需要再改变一个括号(可以是自己)使得序列依旧保持平衡。问改变哪个括号可以达到目的,当然改变的括号越左边越好。
思路:
对于这个括号序列,我们可以将'('设为1,')'设为0,那么就能算出他们的前缀和。
比如序列()(()),前缀和就是1,0,1,2,1,0。可以发现如果是平衡的序列,所有的前缀和都是大于等于0的。
如果我们改变一个'('并且他的位置是p,它本身以及它后面的前缀和都-2,我们就需要寻找一个')'将其转换。那么一旦找到其位置x以后,区间[x,n]上的前缀和都+2。所以只要在p之前找到一个')'将其转换就可以了。题目要求越靠左越好,那就从头开始找到第一个')'即可。
如果我们改变一个')'并且他的位置是p,它本身以及它后面的前缀和都+2,我们同样的需要寻找一个'('将其转换。此时寻找其位置x的时候,要保证[x,n]上面所有的前缀和都要大于等于2。所以我们就寻找第一个满足条件的这个位置就好了。
代码:
#include<stdio.h>#include<string.h>#define M 300005struct tree{ int l,r,mini,add,maxi;}tree[M<<2];int n,m,sum[M];char s[M];int min(int a,int b){ return a<b?a:b;}int max(int a,int b){ return a>b?a:b;}void pushup(int i){ if(tree[i].l==tree[i].r)return; tree[i].mini=min(tree[i<<1].mini,tree[i<<1|1].mini); tree[i].maxi=max(tree[i<<1].maxi,tree[i<<1|1].maxi);}void build(int l,int r,int i){ tree[i].l=l; tree[i].r=r; tree[i].add=0; if(l==r){ tree[i].maxi=tree[i].mini=sum[l]; return; } int mid=l+r>>1; build(l,mid,i<<1); build(mid+1,r,i<<1|1); pushup(i);}void pushdown(int i){ if(tree[i].add!=0){ tree[i<<1].add+=tree[i].add; tree[i<<1|1].add+=tree[i].add; tree[i<<1].mini+=tree[i].add; tree[i<<1|1].mini+=tree[i].add; tree[i<<1].maxi+=tree[i].add; tree[i<<1|1].maxi+=tree[i].add; tree[i].add=0; } return ;}void update(int l,int r,int i,int z){ if(tree[i].l==l&&tree[i].r==r){ tree[i].mini+=z; tree[i].maxi+=z; tree[i].add+=z; return; } pushdown(i); int mid=tree[i].l+tree[i].r>>1; if(r<=mid)update(l,r,i<<1,z); else if(l>mid)update(l,r,i<<1|1,z); else { update(l,mid,i<<1,z); update(mid+1,r,i<<1|1,z); } pushup(i);}int query1(int i){ if(tree[i].l==tree[i].r){ return tree[i].r; } pushdown(i); if(tree[i<<1].maxi!=tree[i<<1].r)return query1(i<<1); //如果从头开始,还没出现')'之前,所有的'('的值都是和他本身相同的。 else return query1(i<<1|1);}int query2(int i){ if(tree[i].l==tree[i].r){ return tree[i].l; } pushdown(i); if(tree[i<<1|1].mini>=2)return query2(i<<1); //只要右区间上最小的那个值都大于等于2,就可以往左区间去找。找到以后要加一。 else return query2(i<<1|1);}int main(){ int i,j,k,x; while(scanf("%d%d",&n,&m)!=EOF) { scanf("%s",s); sum[0]=0; for(i=1;i<=n;i++) { if(s[i-1]=='(')sum[i]=sum[i-1]+1; else sum[i]=sum[i-1]-1; } build(1,n,1); int tmp,ans; while(m--) { scanf("%d",&x); if(s[x-1]=='('){ s[x-1]=')'; update(x,n,1,-2); tmp=query1(1); ans=tmp; s[tmp-1]='('; update(tmp,n,1,2); } else if(s[x-1]==')'){ s[x-1]='('; update(x,n,1,2); tmp=query2(1)+1; ans=tmp; s[tmp-1]=')'; update(tmp,n,1,-2); } printf("%d\n",ans); } } return 0;}/*8 3(())(())6*/
0 0
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest G題 (线段树区间更新)
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest G題:Flipping Parentheses [线段树]
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest A題:Bit String Reordering [bfs]
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest B題:Miscalculation [简单模拟]
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest C題:Shopping [贪心+并查集]
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest D題:Space Golf [二分+三分+基础数学]
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest D题 Space Golf(三分)
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest A题 Bit String Reordering(暴力)
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest F題:There is No Alternative [最小生成树]
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest G
- 2017 ACM-ICPC Asia Xi’an Regional Contest G 线段树+拆位
- 2014 ACM/ICPC Asia Regional Contest - B
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest(G - The Problem to Slow Down You-回文树)
- Codeforce 2014ACM-ICPC, Asia Xian Regional Contest Problem G. The Problem to Slow Down You(回文树)
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest F Color
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest C
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest
- 2015 ACM/ICPC Asia Regional Changchun Online 1007 hdu 5443 线段树区间最值
- 编程之美-24点游戏方法整理
- 盘点JavaScript里好用的原生API
- 带checkbox的ListView实现(三)——CheckableImageView的实现方法
- swift 对象类型转换
- MIPI-技术浅谈
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest G題 (线段树区间更新)
- IPsec 技术原理总结
- 第一个网页爬虫程序
- 关于虚拟Virtual DOM
- 怎么学习Java
- 如何添加 .PCH OR PREFIX.PCH 文件到 XCODE 6?
- swift 协议
- Class file collision: A resource exists with a different case:
- swift 委托/代理模式