BestCoder 2nd Anniversary 1002 Arrange
排除所有不符合条件后根据当前位置上下界计算,
由于前面取的数肯定在之后的区间内,所以去掉已取的个数即可。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 #define LL __int64 6 const int N=100005; 7 const LL mod=998244353; 8 int t,n,num,b[N],c[N]; 9 bool flag; 10 LL ans; 11 int main() 12 { 13 scanf("%d",&t); 14 while(t--) 15 { 16 scanf("%d",&n); 17 for(int i=0;i<n;i++) scanf("%d",&b[i]); 18 for(int i=0;i<n;i++) scanf("%d",&c[i]); 19 if(b[0]!=c[0]) 20 { 21 puts("0"); continue; 22 } 23 flag=0; 24 num=ans=1; 25 for(int i=1;i<n;i++) 26 { 27 if(b[i]!=b[i-1]&&c[i]!=c[i-1] || b[i-1]<b[i] || c[i-1]>c[i])//不符合条件 28 { 29 flag=1; break; 30 } 31 else if(c[i]!=c[i-1]||b[i]!=b[i-1]) num++; //已确定的数字数+1 32 else 33 { 34 ans=(ans*(c[i]-b[i]+1-num))%mod;//该位上未确定的数字中的符合条件的个数 35 num++;//已确定的数字数+1 36 } 37 } 38 if(flag) 39 { 40 puts("0"); continue; 41 } 42 printf("%I64d\n",ans); 43 } 44 } 45 /* 46 2 47 5 48 4 4 1 1 1 49 4 5 5 5 5 50 */
我自倾杯,君且随意