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

 

转载于:https://www.cnblogs.com/nicetomeetu/p/5683207.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值