hdu_5719_Arrange(腦洞題)

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章