利用第一个单减函数和第二个单增函数的性质 从头到尾扫一遍设立一个维护此时最大最小值之间可以用的变量一次次累乘就行了
#include<cstdio>
#include<set>
#define LL long long
#define mod 998244353
using namespace std;
int a[100005],b[100005],n;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
if(a[1]==b[1])
{
LL ans = 1;
int se = 0;
int mi = a[1],ma = b[1];
for(int i=2;i<=n;i++)
{
if(a[i]>b[i]||a[i]>a[i-1]||b[i]<b[i-1])
{
ans = 0;
break;
}
else{
if(a[i]==a[i-1]&&b[i]==b[i-1])
{
if(se>=1)
{
ans*=se;
ans%=mod;
se--;
}
else ans = 0;
}
else
{
if(a[i]!=a[i-1])
{
se+=mi-a[i]-1;
mi = a[i];
}
if(b[i]!=b[i-1])
{
se+=b[i]-ma-1;
ma = b[i];
}
}
}
}
printf("%I64d\n",ans);
}
else printf("0\n");
}
return 0;
}