Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35564 | hi_hi | 【J】T4 | C++ | 解答错误 | 0 | 234 MS | 9636 KB | 2056 | 2024-12-11 21:22:02 |
#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[i-1]=sum; t=i+1; break; } } if(t==-1){ long long sum=0; for(int i=1;i<=n*2-1;i++){ sum+=ck[i]; } printf("%lld\n",sum); continue; } long long ji=t; while(t!=-1 && t<2*n-1){ long long now=c[t]; dp[t]=((ji-1)/2)*(c[t]+dp[t-2])+c[t]; sum+=dp[t]; sum%=md; if(t==2*n-1)break; while(t<2*n-1){ t+=2; if(c[t-1]==-1)now=c[t]; dp[t]=((ji-1)/2)*(now+dp[ji])+ck[t]; sum+=dp[t]; sum%=md; if(c[t+1]==-1){ t=t+2; ji=t-1; break; } } } printf("%lld\n",sum); } }