求调 & 玄关
查看原帖
求调 & 玄关
537046
大眼仔Happy楼主2023/11/9 15:25

lz已经急了

#include<bits/stdc++.h>
using namespace std;
#define res f[i][sp][sq]
const int N=105,D=1005,mod=998244353;
int inline read()
{
	int num=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
	return num*f;
}
int n,d,i,p[N],q[N];
int f[N][D][D],ans;
int kpos[N][N],kneg[N][N];
int inc(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int dec(int x,int y){return x-y<0?x-y+mod:x-y;}
int CalcPos(int sx,int sy,int ex,int ey)
{
	if(sx>sy)return 0;
	return dec(kpos[ex][ey],(sx>0&&sy>0)?kpos[sx-1][sy-1]:0);
} // LeftDown - RightUp
int CalcNeg(int sx,int sy,int ex,int ey)
{
	if(sx>sy)return 0;
	return dec(kneg[ex][ey],(sx>0&&sy<d)?kneg[sx-1][sy+1]:0);
} // LeftUp - RightDown 
void maintain()
{
	memset(kpos,0,sizeof(kpos));memset(kneg,0,sizeof(kneg));
	for(int sp=0;sp<=d;sp++)
	{
		for(int sq=0;sq<=d;sq++)
		{
			if(sp>0&&sq>0)kpos[sp][sq]=inc(kpos[sp-1][sq-1],res);
			else kpos[sp][sq]=res;
		}
	}
	for(int sp=0;sp<=d;sp++)
	{
		for(int sq=d;sq>=0;sq--)
		{
			if(sp>0&&sq<d)kneg[sp][sq]=inc(kneg[sp-1][sq+1],res);
			else kneg[sp][sq]=res;
		}
	}
}
int main(){
	n=read();d=read();
	for(int i=1;i<=n;i++)p[i]=read();
	for(int i=1;i<=n;i++)q[i]=read();
	f[0][0][0]=1;maintain();
	for(i=1;i<=n;i++)
	{
		for(int sp=0;sp<=d;sp++)
		{
			for(int sq=0;sq<=d;sq++)
			{
				int L=max(p[i]-sp,q[i]-sq),R=min(p[i]+sp,q[i]+sq); // r in range of L to R
				if(L>R)continue;
				
				/*
				for(int r=L;r<=R;r++)
				{
					int wp=abs(p[i]-r),wq=abs(q[i]-r);
					f[i][sp][sq]=inc(f[i][sp][sq],f[i-1][sp-wp][sq-wq]);
				}
				*/
				
//				/*
				int mn=min(p[i],q[i]),mx=max(p[i],q[i]);
				int sx,sy,ex,ey;
				
				// situation 1 : r in range of L to mn-1
				
				if(L<mn)
				{
					sx=L+(sp-p[i]);sy=L+(sq-q[i]);
					ex=min((mn-1),R)+(sp-p[i]);ey=min((mn-1),R)+(sq-q[i]);
					printf("%d %d %d %d\n",sx,sy,ex,ey);
					res=inc(res,CalcPos(sx,sy,ex,ey));
				}
				
				// situation 2 : r in range of mn to mx
				
				if(p[i]<=q[i])
				{
					sx=-max(R,mx)+(sp+p[i]);sy=max(R,mx)+(sq-q[i]);
					ex=-min(L,mn)+(sp+p[i]);ey=min(L,mn)+(sq-q[i]);
				}
				else 
				{
					sx=min(L,mn)+(sp-p[i]);sy=-min(L,mn)+(sq+q[i]);
					ex=max(R,mx)+(sp-p[i]);ey=-max(R,mx)+(sq+q[i]);
				}
				printf("%d %d %d %d\n",sx,sy,ex,ey);
				res=inc(res,CalcNeg(sx,sy,ex,ey));
				
				//situation 3 : r in range of mx+1 to R
				
				if(mx<R)
				{
					sx=-R+(sp+p[i]);sy=-R+(sq+q[i]);
					ex=-max((mx+1),L)+(sp+p[i]);ey=-max((mx+1),L)+(sq+q[i]);
					printf("%d %d %d %d\n",sx,sy,ex,ey);
					res=inc(res,CalcPos(sx,sy,ex,ey));
				}
				
				printf("\n\n");
//				*/
			}
		}
		maintain();
	}
	for(int sp=0;sp<=d;sp++)
		for(int sq=0;sq<=d;sq++)
			ans=inc(ans,f[n][sp][sq]);
	printf("%d",ans);
	return 0;
}
2023/11/9 15:25
加载中...