题目连接:hdu_5719_Arrange
题意:
给你1-n这 n个数,设一个排列的第i个数为Ai, Bi为A1到Ai的最小值,Ci为C1到Ci的最大值,问你有多少种排列方式,然后输出取模后的答案
题解:
最开始没注意每个数只能用一次,操蛋!这个条件太隐藏了,我们从1到n位开始扫,并且维护一个区间还剩多少数没有用,然后用乘法计数就是最终的答案,注意一些导致答案为0的条件即可
#include<cstdio>
#define F(i,a,b) for(int i=a;i<=b;i++)
const int mod=998244353,N=1e5+7;
int a[N],b[N];
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
F(i,1,n)scanf("%d",a+i);
F(i,1,n)scanf("%d",b+i);
if(a[1]!=b[1])puts("0");
else{
int ma=a[1],mi=a[1],sq=0;
long long ans=1;
F(i,2,n){
if(a[i]>b[i]){ans=0;break;}
if(a[i]>mi||b[i]<ma){ans=0;break;}
if(a[i]<mi&&b[i]>ma){ans=0;break;}
if(a[i]<mi){sq+=mi-a[i]-1,mi=a[i];continue;}
if(b[i]>ma){sq+=b[i]-ma-1,ma=b[i];continue;}
if(sq==0){ans=0;break;}
ans=ans*sq%mod,sq--;
}
printf("%lld\n",ans);
}
}
return 0;
}