傳送門
 
文章目錄
 
題意:
 
 
思路:
 
首先一個括號序列合法的條件可以轉(zhuǎn)化成兩個(左括號代價為111,右括號代價為?1-1?1):
 (1) 左括號個數(shù)等于右括號個數(shù)。
 (2) 括號的前綴和非負。
 所以我們直接用線段樹維護一個前綴和序列,維護一下最小值即可。要輸出的最大嵌套數(shù)就是前綴和的最大值,再維護一個最大值即可。
 
#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
;
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()
{
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;
}
                            總結(jié)
                            
                                以上是生活随笔為你收集整理的Codeforces Round #603 (Div. 2) E. Editor   线段树维护括号序列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。