zoukankan      html  css  js  c++  java
  • BestCoder 2nd Anniversary/HDU 5719 姿势

    Arrange

    Accepts: 221
    Submissions: 1401
    Time Limit: 8000/4000 MS (Java/Others)
    Memory Limit: 262144/262144 K (Java/Others)
    问题描述
    Cupid一不小心将爱情之箭射到了自己,他爱上了Psyche。
    
    这引起了他的母亲Venus的注意。Venus将Psyche带到了一堆打乱的谷堆旁。
    
    这儿共有n 堆稻谷,编号为1 n。Psyche需要将这些谷堆以某种顺序排列,设最终排在第i 位的谷堆是 Ai​​。
    
    她得知了一些该排列的要求:
    
      1. 对于任意整数i∈[1,n]  A1​​,A2​​,...,Ai​​的最小值为Bi 
    
      2. 对于任意整数i∈[1,n]  A1​​,A2​​,...,Ai​​的最大值为Ci 
    
    现在Psyche想知道,共有多少种合法的排列。由于答案可能很大,输出时对998244353 取模。
    输入描述
    第一行,一个整数T (1≤T≤15)代表数据组数。
    
    对于每组数据,第一行有一个整数n  (1≤n≤105) ,代表排列大小。
    
    第二行,n 个整数,第i 个整数为Bi B_i Bi​​ (1≤Bi≤n)
    
    第三行,n 个整数,第i 个整数为Ci C_i Ci​​ (1≤Ci≤n)
    输出描述
    输出T 行,对于每组数据输出答案对998244353 取模的结果。
    输入样例
    2
    3
    2 1 1
    2 2 3
    5
    5 4 3 2 1
    1 2 3 4 5
    输出样例
    1
    0
    Hint
    对于第一组数据,只有一种合法的排列(2,1,3) 
    
    对于第二组数据,没有合法的排列。

    题意:中文题意 长度为n的序列 b[i] 代表前i个数的最小值 c[i]代表前i个数的最大值 问有多少种合法的排列

    题解:考虑只有当b[j]==b[j-1]&&c[j]==c[j-1])的时候才有贡献
    但是注意1~n的数只能出现一次 这就是gg的作用

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<queue>
     5 #include<stack>
     6 #include<vector>
     7 #include<map>
     8 #include<algorithm>
     9 #define ll __int64
    10 #define mod 1e9+7
    11 #define PI acos(-1.0)
    12 using namespace std;
    13 int t;
    14 ll b[100005];
    15 ll c[100005];
    16 int n;
    17 int main()
    18 {
    19     while(scanf("%d",&t)!=EOF)
    20     {
    21         for(int i=1; i<=t; i++)
    22         {
    23             scanf("%d",&n);
    24             for(int j=1; j<=n; j++)
    25                 scanf("%I64d",&b[j]);
    26             for(int j=1; j<=n; j++)
    27                 scanf("%I64d",&c[j]);
    28             if(b[1]!=c[1])
    29             {
    30                 printf("0
    ");
    31                 continue;
    32             }
    33             ll ans=1;
    34             ll m=1;
    35             ll gg=1;//注意
    36             for(int j=2; j<=n; j++)
    37             {
    38                 if(b[j]>b[j-1]||c[j]<c[j-1])
    39                 {
    40                     m=0;
    41                     continue;
    42                 }
    43                 else
    44                 {
    45                     if(b[j]!=b[j-1]&&c[j]!=c[j-1])
    46                     {
    47                         m=0;
    48                         continue;
    49                     }
    50                     else
    51                     {
    52                         if(b[j]!=b[j-1]||c[j]!=c[j-1])
    53                             gg++;
    54                         else
    55                         {
    56                             ans*=(c[j]-gg-b[j]+1);
    57                             gg++;
    58                             ans%=998244353;
    59                         }
    60                     }
    61                 }
    62             }
    63             if(m)
    64                 printf("%I64d
    ",ans);
    65             else
    66                 printf("0
    ");
    67         }
    68     }
    69     return 0;
    70 }
     
  • 相关阅读:
    【随手记录】PG数值类型记录
    【SkyWalking】 Can't find service by service instance id from cache, service instance id is:xxx
    【随手记录】定时邮件发送限制 SMTPSendFailedException:557
    【随手记录】IDEA一个工程打开多个项目
    【随手记录】时间格式转换报错:while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ'
    【随手记录】实体类里方法自动执行问题
    【随手记录】IDEA的工具mode切换
    【随手记录】MagicNumber 魔数 在协议里作用
    js singleton
    js 对象的深层嵌套函数对对象属性的访问
  • 原文地址:https://www.cnblogs.com/hsd-/p/5680732.html
Copyright © 2011-2022 走看看