码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5719 BestCoder 2nd Anniversary B Arrange 简单计数问题

时间:2016-07-24 23:58:21      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: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\n", ans);
    }
    return 0;
}

 

hdu 5719 BestCoder 2nd Anniversary B Arrange 简单计数问题

标签:

原文地址:http://www.cnblogs.com/hxer/p/5701835.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!