Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35581 | hi_hi | 【J】T4 | C++ | 通过 | 100 | 256 MS | 9632 KB | 2505 | 2024-12-12 21:09:54 |
#include<bits/stdc++.h> using namespace std; long long _,n,c[500005],dp[500005],ck[500005]; long long md=998244353; int main(){ scanf("%lld%lld",&_,&_); while(_--){ long long flag1=1,tt=0,flag2=1; scanf("%lld",&n); for(int i=1;i<=n*2-1;i++){ if(i%2==1){ scanf("%lld",&c[i]); } else{ char t; scanf(" %c",&t); if(t=='+'){ c[i]=-1; } else{ c[i]=-2; } } } memset(dp,0,sizeof(dp)); memset(ck,0,sizeof(ck)); long long sum=0; for(int i=1;i<=n*2-1;i+=2){ if(c[i-1]==-2 || i==1)ck[i]=ck[i-2]*c[i]+c[i]; else ck[i]=c[i]; ck[i]%=md; //printf("%lld ",ck[i]); } long long t=-1; for(int i=2;i<=n*2-1;i+=2){ if(c[i]==-1){ for(int j=1;j<=i;j++){ sum+=ck[j]; sum%=md; dp[j]=ck[j]; } t=i+1; break; } } sum=0; if(t==-1){ long long sum=0; for(int i=1;i<=n*2-1;i++){ sum+=ck[i]; sum%=md; } printf("%lld\n",sum); continue; } long long ji=t-1; while(t!=-1 && t<=2*n-1){ if(dp[t]!=0)break; long long now=c[t]; //printf("///%lld %lld %lld %lld %lld/// ",ji,t,dp[ji-1],ck[t],now); dp[t]=dp[ji-1]+((ji)/2+1)*c[t]; dp[t]%=md; if(t==2*n-1)break; if(c[t+1]==-1){ ji=t+1; } while(t<2*n-1){ t+=2; if(c[t-1]==-1)now=c[t]; else now*=c[t]; now=now%md; //printf("///%lld %lld %lld %lld %lld/// ",ji,t,dp[ji-1],ck[t],now); dp[t]=dp[ji-1]+ck[t]+(ji/2)*now; dp[t]%=md; if(c[t+1]==-1){ ji=t+1; t=t+2; break; } } } for(int i=1;i<=n*2-1;i+=2){ //printf("%lld ",dp[i]); sum+=dp[i]; sum%=md; } printf("%lld\n",sum); } }