WA
查看原帖
WA
124676
JimmyFlower楼主2024/7/4 16:44
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ri register int
using namespace std;
typedef long long ll;
const int N=200010;
const ll M=998244353;
int T,n;
ll x,a,b,c,d,fu[N],fl[N],f[N][3]; //fu最大值,fl最小值,f方案数 
void cal(int k,int b,ll x){f[k][b]=(f[k][b]+x)%M;}
void solve()
{
	scanf("%d",&n); fu[0]=fl[0]=0,f[0][1]=f[0][0]=1;
	for(ri i=1;i<=n;i++)
	{
		scanf("%lld",&x);
		a=fu[i-1]+x,b=fl[i-1]+x,c=llabs(fu[i-1]+x),d=llabs(fl[i-1]+x);
		fu[i]=max(max(a,b),max(c,d));
		fl[i]=min(min(a,b),min(c,d));
		f[i][1]=f[i][0]=0;
		if(fu[i]==a) cal(i,1,f[i-1][1]);
		if(fu[i]==b) cal(i,1,f[i-1][0]);
		if(fu[i]==c) cal(i,1,f[i-1][1]);
		if(fu[i]==d) cal(i,1,f[i-1][0]);
		if(fl[i]==a) cal(i,0,f[i-1][1]);
		if(fl[i]==b) cal(i,0,f[i-1][0]);
		if(fl[i]==c) cal(i,0,f[i-1][1]);
		if(fl[i]==d) cal(i,0,f[i-1][0]);
		if(fu[i-1]==fl[i-1]&&f[i-1][1]==f[i-1][0]) f[i][1]/=2,f[i][0]/=2;
	}
	printf("%lld\n",f[n][1]);
}
int main()
{
	scanf("%d",&T);
	while(T--) solve();
	return 0;
}

改的和题解一样了都,还是WA

2024/7/4 16:44
加载中...