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 */

 

posted @ 2016-07-19 00:04  nicetomeetu  阅读(154)  评论(0编辑  收藏  举报