E. Editor
线段树维护 前缀和的min,max,
定义( 为 1 ,)为-1
最大嵌套层数=最大前缀和.
O(1) 复杂度 获取最大前缀和 ,即 tree_max[1]
push_down():注意lazy下传更新儿子tree和lazy!
#include<bits/stdc++.h> #define ls o*2 #define rs o*2+1 #define mid (l+r)/2 using namespace std; int n; int tree_min[4000006],lazy[4000006],tree_max[4000006]; char s[1000006]; char ss[1000006]; int len=0; void push(int o,int l,int r) { tree_min[ls]+=lazy[o]; tree_min[rs]+=lazy[o]; tree_max[ls]+=lazy[o]; tree_max[rs]+=lazy[o]; lazy[ls]+=lazy[o]; lazy[rs]+=lazy[o];//lazy下传!! lazy[o]=0; } void up(int o,int l,int r,int ll,int rr,int v) { if(ll<=l&&r<=rr) { tree_min[o]+=v; tree_max[o]+=v; lazy[o]+=v; return ; } if(lazy[o])push(o,l,r); if(ll<=mid) up(ls,l,mid,ll,rr,v); up(rs,mid+1,r,ll,rr,v); tree_min[o]=min(tree_min[ls],tree_min[rs]); tree_max[o]=max(tree_max[ls],tree_max[rs]); } int main() { scanf("%d",&n); scanf("%s",s+1); int now=1; int len=1; int sum=0; for(int i=1;i<=n;i++) { if(i!=1) printf(" "); if(s[i]=='L') now=max(1,--now); else if(s[i]=='R') now++; else if(s[i]=='(') { int x=0; if(ss[now]==')') x=2; else if(ss[now]!='(') x=1; if(x) { up(1,1,n,now,n,x); } ss[now]=s[i]; sum+=x; } else if(s[i]==')') { int x=0; if(ss[now]=='(') x=-2; else if(ss[now]!=')') x=-1; if(x) { up(1,1,n,now,n,x); } ss[now]=s[i]; sum+=x; } else { if(ss[now]=='(') { up(1,1,n,now,n,-1); sum--; } else if(ss[now]==')') { up(1,1,n,now,n,1); sum++; } ss[now]=s[i]; } len=max(len,now); if(sum==0&&tree_min[1]==0) printf("%d",tree_max[1]); //sum判断 ( ) 个数是否相等 else printf("-1",sum); } }
10-09
242
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-29