題目連接: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;
}