题意:
思路:
首先一个括号序列合法的条件可以转化成两个(左括号代价为
1
1
1,右括号代价为
−
1
-1
−1):
(1) 左括号个数等于右括号个数。
(2) 括号的前缀和非负。
所以我们直接用线段树维护一个前缀和序列,维护一下最小值即可。要输出的最大嵌套数就是前缀和的最大值,再维护一个最大值即可。
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;
//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;
int n;
char s[N],a[N];
struct Node
{
int l,r;
int sum,lazy;
int mx,mi;
}tr[N<<2];
void pushup(int u)
{
tr[u].sum=tr[L].sum+tr[R].sum;
tr[u].mx=max(tr[L].mx,tr[R].mx);
tr[u].mi=min(tr[L].mi,tr[R].mi);
}
void pushdown(int u)
{
if(tr[u].lazy)
{
int lazy=tr[u].lazy; tr[u].lazy=0;
tr[L].lazy+=lazy; tr[R].lazy+=lazy;
tr[L].mi+=lazy,tr[L].mx+=lazy;
tr[R].mi+=lazy,tr[R].mx+=lazy;
}
}
void build(int u,int l,int r)
{
tr[u]={l,r};
tr[u].mi=0; tr[u].mx=0;
if(l==r) return;
build(L,l,Mid); build(R,Mid+1,r);
}
void modify(int u,int l,int r,int x)
{
if(tr[u].l>=l&&tr[u].r<=r)
{
tr[u].lazy+=x;
tr[u].mi+=x,tr[u].mx+=x;
return;
}
pushdown(u);
if(l<=Mid) modify(L,l,r,x);
if(r>Mid) modify(R,l,r,x);
pushup(u);
}
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
scanf("%d%s",&n,s+1);
build(1,1,n+1);
int pos=1,cnt1=0,cnt2=0;
for(int i=1;i<=n;i++)
{
if(s[i]=='R') pos++;
else if(s[i]=='L') pos=max(1,pos-1);
else if(s[i]=='(')
{
if(a[pos]!='(')
{
if(a[pos]==')') modify(1,pos,n+1,2),cnt1++,cnt2--;
else modify(1,pos,n+1,1),cnt1++;
a[pos]='(';
}
}
else if(s[i]==')')
{
if(a[pos]!=')')
{
if(a[pos]=='(') modify(1,pos,n+1,-2),cnt1--,cnt2++;
else modify(1,pos,n+1,-1),cnt2++;
a[pos]=')';
}
}
else
{
if(a[pos]==')') modify(1,pos,n+1,1),cnt2--;
else if(a[pos]=='(') modify(1,pos,n+1,-1),cnt1--;
a[pos]=s[i];
}
if(cnt1!=cnt2||tr[1].mi<0) printf("-1 ");
else printf("%d ",tr[1].mx);
}
return 0;
}
/*
*/