玄学问题
查看原帖
玄学问题
556740
hzx360楼主2022/8/13 22:30

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];
}
2022/8/13 22:30
加载中...