BestCoder 2nd Anniversary Arrange

来源:互联网 发布:人工智能之父是 编辑:程序博客网 时间:2024/05/11 23:44

利用第一个单减函数和第二个单增函数的性质 从头到尾扫一遍设立一个维护此时最大最小值之间可以用的变量一次次累乘就行了

#include<cstdio>#include<set>#define LL long long#define mod 998244353using namespace std;int a[100005],b[100005],n;int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(int i=1;i<=n;i++)scanf("%d",&a[i]);        for(int i=1;i<=n;i++)scanf("%d",&b[i]);        if(a[1]==b[1])        {            LL ans = 1;            int se = 0;            int mi = a[1],ma = b[1];            for(int i=2;i<=n;i++)            {                if(a[i]>b[i]||a[i]>a[i-1]||b[i]<b[i-1])                {                    ans = 0;                    break;                }                else{                    if(a[i]==a[i-1]&&b[i]==b[i-1])                    {                         if(se>=1)                         {                             ans*=se;                             ans%=mod;                             se--;                         }                         else ans = 0;                    }                    else                    {                        if(a[i]!=a[i-1])                        {                          se+=mi-a[i]-1;                          mi = a[i];                        }                        if(b[i]!=b[i-1])                        {                          se+=b[i]-ma-1;                          ma = b[i];                        }                    }                }            }            printf("%I64d\n",ans);        }        else printf("0\n");    }    return 0;}
0 0