zoukankan      html  css  js  c++  java
  • 【JZOJ4924】【NOIP2017提高组模拟12.17】向再见说再见

    题目描述

    这里写图片描述

    数据范围

    这里写图片描述

    =w=

    h[i]表示,甲队得到i分的方案数。
    那么h[(n+k)/2]h[(nk)/2]就是答案。


    g[i]表示,甲队得到至少i分的方案数。
    那么h[i]=g[i]j>ih[j]Cij
    思考这条递推式的正确性:
    考虑g[i]h[i]多了什么,对于每个j>ih[j]中的每个单位表示:
    甲队中的j个元素,都与乙队中的j个元素一一对应。
    如果从这j个元素中任意选择i个元素,那么有Cij中选法,其中每种选法都可以唯一扩展到这个单位。


    g可用动态规划求。

    代码

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const char* fin="aP3.in";
    const char* fout="aP3.out";
    const ll inf=0x7fffffff;
    const ll maxn=2007,mo=1000000007;
    ll n,m,i,j,k,ans;
    ll a[maxn],b[maxn];
    ll A[maxn],B[maxn];
    ll f[2][maxn];
    ll c[maxn][maxn];
    ll h[maxn],fact[maxn];
    int main(){
        scanf("%lld%lld",&n,&m);
        for (i=1;i<=n;i++) scanf("%lld",&a[i]);
        for (i=1;i<=n;i++) scanf("%lld",&b[i]);
        for (i=0;i<=n;i++){
            c[0][i]=1;
            for (j=1;j<=i;j++) c[j][i]=(c[j-1][i-1]+c[j][i-1])%mo;
        }
        if ((n+m)%2) printf("0");
        else{
            ll v=0;
            sort(a+1,a+n+1);
            sort(b+1,b+n+1);
            j=0;
            for (i=1;i<=n;i++){
                while (j<n && a[i]>b[j+1]) j++;
                A[i]=j;
            }
            f[v][0]=1;
            for (i=1;i<=n;i++){
                v^=1;
                for (j=0;j<=i;j++){
                    f[v][j]=0;
                    f[v][j]=f[1-v][j];
                    if (j) f[v][j]=(f[v][j]+f[1-v][j-1]*(A[i]-(j-1)))%mo;
                }
            }
            fact[0]=1;
            for (i=1;i<=n;i++) fact[i]=fact[i-1]*i%mo;
            for (i=n;i>=0;i--){
                h[i]=f[v][i]*fact[n-i];
                for (j=i+1;j<=n;j++){
                    h[i]=((h[i]-c[j-i][j]*h[j])%mo+mo)%mo;
                }
                if (i==(n+m)/2 || i==(n-m)/2) ans=(ans+h[i])%mo;
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    HDU 2553 N皇后问题
    HDU 2553 N皇后问题
    HDU 1045 Fire Net
    HDU 1045 Fire Net
    HUD 1175 连连看
    HUD 1175 连连看
    poj3190 Stall Reservations (贪心+优先队列)
    poj3190 Stall Reservations (贪心+优先队列)
    ThinkPHP 模板截取字符串 【转载】
    鼠标位置距浏览器窗体距离
  • 原文地址:https://www.cnblogs.com/hiweibolu/p/6714816.html
Copyright © 2011-2022 走看看