zoukankan      html  css  js  c++  java
  • hdu 5719 BestCoder 2nd Anniversary B Arrange 简单计数问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5719

    题意:一个数列为1~N的排列,给定mn[1...n]和mx[1...n],问有符合的排列数为多少?如果不存在,输出0;

    思路:

    有解的几种条件:

    1. mn , mx 变化单调;

    2. mn,mx 不能同时变化;

    3. 一个位置可选的个数>0;

    当解存在时,递推出每次可选择的个数,num += mx[i] - mx[i-1] + mn[i-1] - mn[i] - 1; 即可;

    坑:开始想成了求解连续可选区间长度,和连续可选区间的 可选数;然后使用组合数和全排列...并且貌似还是错的;还是及时计数比较好;

    及时计数的特点: 在线求出对结果的贡献,并且可以不管其他的状态对当前处理的状态(点)的影响;

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<bits/stdc++.h>
    using namespace std;
    #define rep0(i,l,r) for(int i = (l);i < (r);i++)
    #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
    #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
    #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
    #define MS0(a) memset(a,0,sizeof(a))
    #define MS1(a) memset(a,-1,sizeof(a))
    #define MSi(a) memset(a,0x3f,sizeof(a))
    #define inf 0x3f3f3f3f
    #define lson l, m, rt << 1
    #define rson m+1, r, rt << 1|1
    #define A first
    #define B second
    #define MK make_pair
    #define esp 1e-8
    #define zero(x) (((x)>0?(x):-(x))<eps)
    #define bitnum(a) __builtin_popcount(a)
    #define clear0 (0xFFFFFFFE)
    
    typedef pair<int,int> PII;
    const int mod = 998244353;
    typedef long long ll;
    typedef unsigned long long ull;
    template<typename T>
    void read1(T &m)
    {
        T x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        m = x*f;
    }
    template<typename T>
    void read2(T &a,T &b){read1(a);read1(b);}
    template<typename T>
    void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
    template<typename T>
    void out(T a)
    {
        if(a>9) out(a/10);
        putchar(a%10+'0');
    }
    inline ll gcd(ll a,ll b){ return b == 0? a: gcd(b,a%b); }
    const int maxn = 100007;
    int a[maxn], b[maxn];
    int main()
    {
        //freopen("data.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        int T, kase = 1;
        scanf("%d",&T);
        while(T--){
            int n, m, flag = 1;
            read1(n);
            rep1(i,1,n) read1(a[i]);
            rep1(i,1,n) read1(b[i]);
            if(a[1] != b[1]) flag = 0;
            ll ans = 1,num = 0;
            for(int i = 2;i <= n && flag; i++){
                if(a[i] > a[i-1] || b[i] < b[i-1]) flag = 0;
                if(a[i] != a[i-1] && b[i] != b[i-1]) flag = 0;
                if(num < 0) flag = 0;
                if(a[i] == a[i-1] && b[i] == b[i-1])
                    ans = (ans * num)% mod;
                num += b[i] - b[i-1] + a[i-1] - a[i] - 1;
            }
            if(!flag) puts("0");
            else printf("%lld
    ", ans);
        }
        return 0;
    }
    
  • 相关阅读:
    Linux Kernel 'b43'无线驱动本地特权提升漏洞
    Linux Kernel “dispatch_discard_io()”RO Disk Manipulation安全绕过漏洞
    Linux kernel ‘fill_event_metadata’函数资源管理错误漏洞
    Linux kernel ‘b43_request_firmware’函数格式化字符串漏洞
    phpcms 2007 onunload.inc.php update SQL注入漏洞
    出差到天津的计划
    Auguries of Innocence
    做一个东西要多久
    Wise Installation 9 的一个容易忽视的选项
    天津行总结路在嘴底下
  • 原文地址:https://www.cnblogs.com/hxer/p/5701835.html
Copyright © 2011-2022 走看看