翻转括号序列
暴力过20%数据
思路:括号合法序列问题可以利用前缀和,将"(“看成 1,”)"看成 0,规律是到某个位置为止的前缀和>0并且到最后前缀和=0。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int n,m;
string s;
int a[N];
int main( ){
cin>>n>>m>>s;
for(int i=0;i<s.size();i++)
if(s[i]=='(')a[i+1]=1;
else a[i+1]=-1;
while(m--){
int op,L,R;
cin>>op;
if(op==1){
cin>>L>>R;
for(int i=L;i<=R;i++){
a[i] = -a[i];
}
}else if(op==2){
cin>>L;
int sum =0,ans = 0;
for(int i=L;i<=n;i++){
sum += a[i];
if(sum<0)break;
if(!sum) ans = max(ans,i);
}
cout<<ans<<'\n';
}
}
return 0;
}