RMQ做法不开O2能A(93ms); 开O2。。。全WA了 有大佬解释下是神马原因吗QWQ
#include<bits/stdc++.h>
using namespace std;
const int N=2e5;
const int mod=10007;
int len,id[N],rev[N],cnt;
int a[20][N],num,ne[N],l[N],r[N],tot,c[N];
int son[2][N];
char s[N];
void mark(int L,int R){
if(L>R)return;
int i=L;
while(i<=R){
if(c[i]==2)id[i]=++cnt,rev[cnt]=i;
if(c[i]==3)i=ne[i];
i++;
}
i=L;
while(i<=R){
if(c[i]==1)id[i]=++cnt,rev[cnt]=i;
if(c[i]==3)i=ne[i];
i++;
}
}
int sit[N];
void deal(){
vector<int>g;
for(int k=0;k<len;k++){
if(c[k]==3)g.push_back(k);
if(c[k]==4)l[++tot]=g.back(),ne[g.back()]=k,r[tot]=k,g.pop_back();
}
for(int k=1;k<=tot;k++)
mark(l[k]+1,r[k]-1);
for(int k=0;k<=len;k++) if(c[k]==1||c[k]==2) a[0][++num]=id[k],sit[id[k]]=num;
for(int j=1;j<=20;j++)
for(int i=1;i+(1<<j)-1<=cnt;i++)
a[j][i]=max(a[j-1][i],a[j-1][i+(1<<(j-1))]);
}
int Query(int L,int R)
{
int k=log2(R-L+1);
return max(a[k][L],a[k][R-(1<<k)+1]);
}
void build(int now,int L,int R){
son[1][now]=son[2][now]=0;
if(sit[now]!=L) son[1][now]=Query(L,sit[now]-1);
if(sit[now]!=R) son[2][now]=Query(sit[now]+1,R);
if(son[1][now]) build(son[1][now],L,sit[now]-1);
if(son[2][now]) build(son[2][now],sit[now]+1,R);
}
int dp[2][N];
void dfs(int u){
if(son[1][u]) dfs(son[1][u]);
if(son[2][u]) dfs(son[2][u]);
if(c[rev[u]]==1){
dp[0][u]=(dp[0][son[1][u]]*dp[0][son[2][u]])%mod;
dp[1][u]=(dp[0][son[1][u]]*dp[1][son[2][u]]%mod+dp[1][son[1][u]]*dp[0][son[2][u]]%mod+dp[1][son[1][u]]*dp[1][son[2][u]]%mod)%mod;
}
else{
dp[0][u]=(dp[0][son[1][u]]*dp[1][son[2][u]]%mod+dp[1][son[1][u]]*dp[0][son[2][u]]%mod+dp[0][son[1][u]]*dp[0][son[2][u]]%mod)%mod;
dp[1][u]=(dp[1][son[1][u]]*dp[1][son[2][u]])%mod;
}
}
int main(){
string o;
s[0]='(';
scanf("%d%s",&len,s+1);
s[len+1]=')';
len+=2;
for(int k=0;k<len;k++){
if(s[k]=='+')c[k]=1;
if(s[k]=='*')c[k]=2;
if(s[k]=='(')c[k]=3;
if(s[k]==')')c[k]=4;
}
deal();
build(cnt,1,cnt);
dp[0][0]=dp[1][0]=1;
dfs(cnt);
cout<<dp[0][cnt];
}