【BZOJ3622】已经没有什么好害怕的了 动态规划+容斥原理

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/44836095");
}

题解:

首先我们给A数组(糖果)和B数组(药片)从小到大排个序。

lasti 表示一个极大值 x 使得 Bx<Ai 。

f(i,j) 表示枚举到第 Ai 时,有至少 j 对匹配,使得 A???>B???

然后枚举到 Ai 不代表也必须只能使用 Bi 以及其前的B数组元素。

f(i,j)=f(i?1,j)+f(i?1,j?1)?(lasti?(j?1) )

其中 f(i?1,j) 表示 Ai 匹配了一个比它大的 B???

f(i?1,j?1)?(lasti?(j?1) ) 则表示匹配了一个比它小的,

而后面的乘数则是它有lasti种选择,其中有 (j?1) 个被用过了。

之后进行容斥原理,设 g(i,j) 表示枚举到第 Ai 时,有正好 j 对匹配,使得 A???>B??? 的方案数。

我们发现对于一个 f(i,j) 它的非确定 A???>B??? 的那些数对中,有 (i?j)!种排列。

然后我们要从中减去不符合要求的,也就是其中有 A???>B???的那些,就得到了 g(i,j) 。

那么显然式子应该是这样的:

g(i,j)=f(i,j)?(i?j)!  ?  ∑nk=j+1g(i,k)?Cij

然后我们考虑应该有多少对 A???>B???

呃,设有 x 对吧,那么就有 n?x对 A???>B???

然后 x?(n?x)=k ,所以 x=n+k2 这里需要特判一下,如果是非整数会出大新闻。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 2050
#define inf 0x3f3f3f3f
#define mod 1000000009
using namespace std;
int a[N],b[N],n,m;
long long fac[N],C[N][N],f[N][N];
int main()
{
    freopen("test.in","r",stdin);

    int i,j,k;

    scanf("%d%d",&n,&m);
    if(n+m&1){puts("0");return 0;}
    m=n+m>>1;

    for(i=1;i<=n;i++)scanf("%d",&a[i]);
    for(i=1;i<=n;i++)scanf("%d",&b[i]);
    sort(a+1,a+n+1),sort(b+1,b+n+1);

    for(k=0,f[0][0]=i=1;i<=n;i++)
    {
        while(k<n&&b[k+1]<a[i])k++;
        for(f[i][0]=j=1;j<=i;j++)
            f[i][j]=(f[i-1][j]+f[i-1][j-1]*max(k-(j-1),0))%mod;
    }
    for(fac[0]=i=1;i<=n;i++)fac[i]=fac[i-1]*i%mod;
    for(i=0;i<=n;i++)
    {
        C[i][0]=1;
        for(j=1;j<=i;j++)C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
    }
    for(i=n;i>=m;i--)
    {
        f[n][i]=f[n][i]*fac[n-i]%mod;
        for(j=i+1;j<=n;j++)
        {
            f[n][i]-=f[n][j]*C[j][i]%mod;
            f[n][i]=(f[n][i]+mod)%mod;
        }
    }
    cout<<f[n][m]<<endl;
    return 0;
}
时间: 2024-10-06 11:03:40

【BZOJ3622】已经没有什么好害怕的了 动态规划+容斥原理的相关文章

BZOJ 3622 已经没有什么好害怕的了 动态规划+容斥原理

题目大意:给定两个长度为n个序列,保证这2n个数字两两不同,求有多少匹配满足a[i]>b[i]的数对数比a[i]<b[i]的数对数多k もう何も怖くない 题解:http://www.cnblogs.com/dyllalala/p/3900077.html OTZ 神思路根本就是想不到啊QAQ でも...もう何も怖くない...(大雾 此外我们可以引入一下WTY公式: C[i][j]=C[i-1][j]*C[i-1][j-1] ...脑残怎么治啊... #include <cstdio>

[bzoj3622]已经没有什么好害怕的了_动态规划_容斥原理

bzoj-3622 已经没有什么好害怕的了 题目大意: 数据范围:$1\le n \le 2000$ , $0\le k\le n$. 想法: 首先,不难求出药片比糖果小的组数. 紧接着,我开始的想法是 $f_{(i,j)}$表示前$i$个糖果中,满足糖果比药片大的组数是$j$的方案数. 进而发现需要将两个数组排序. 到这里一切都很正常,但是我们发现了一个问题:就是我在转移的时候,分两种情况讨论.第一种是当前糖果配对的药片比自己大,第二种是比自己小. 这样的话我需要乘上两个组合数. 但是我们仔细

Bzoj3622 已经没有什么好害怕的了

这题的题面全是图,而博客园的图随时有挂的危险…… 反正能去BZOJ找原题,已经没什么好害怕的了 3622: 已经没有什么好害怕的了 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 476  Solved: 231 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output 4 HINT 输入的2*n个数字保证全不相同. 还有输入应该是第二行是糖果,第三

BZOJ 3622(已经没有什么好害怕的了-Dp+容斥原理)

3622: 已经没有什么好害怕的了 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 7  Solved: 6 [Submit][Status] Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output 4 HINT Source 2014湖北省队互测week2 PS:本题的数据中能量互不相同. 1.我们计算出糖果>药片的组数=k 2.我们计算出f[

[bzoj3622]已经没有什么好害怕的了——容斥or二项式反演+DP

题目大意: 给定两个长度为\(n\)的序列,求有多少种匹配方式,使得\(a_i<b_i\)的个数恰好为\(k\)个. 思路: 据说是一道二项式反演的经典例题了. 首先如果要求正好等于\(k\)个的是不太好求的,我们可以考虑求出至少为\(k\)个的方案数. 首先先把两个序列都按照从小到大的顺序排好序,然后以序列\(b\)为对象dp. 我们设\(f_{i,j}\)表示前\(i\)个数里面强制确定了\(j\)个\(a_i<b_i\)关系的方案数,记\(c_i\)表示在\(a\)中有多少个数<\

BZOJ3622已经没有什么好害怕的了

Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output 4 HINT 输入的2*n个数字保证全不相同. 还有输入应该是第二行是糖果,第三行是药片 题解: 记得以前在学校题库中做过这道题. 先判断k是否可能实现,若能,求出需要有恰好多少对糖果比巧克力大. 现将两组数各自从小到大排序.用dp[i,j]表示给前i个糖果中的j个安排数值更低的的巧克力的方案数. 设第i个糖果比前k个巧克力数值大,则除了d

dp 容斥 bzoj3622 已经没有什么好害怕的了

https://www.lydsy.com/JudgeOnline/problem.php?id=3622 XJOI题 不过没做过.. 容斥计数啊 先排序 记\(f[i][j]\)为前\(i\)位有\(j\)位固定且\(a[j] > b[k]\)的方案数 \[f[i][j] = f[i - 1][j] + f[i - 1][j - 1] \times (last - (j - 1))\] \(last\)为最大的\(k\)使得\(a[i] > b[k]\) 有 \[f[n][i] = \sum

二项式反演及其应用

概念 二项式反演为一种反演形式,常用于通过 "指定某若干个" 求 "恰好若干个" 的问题. 注意:二项式反演虽然形式上和多步容斥极为相似,但它们并不等价,只是习惯上都称之为多步容斥. 引入 既然形式和多步容斥相似,我们就从多步容斥讲起. 我们都知道:$|A\cup B|=|A|+|B|-|A\cap B|$ ,这其实就是容斥原理. 它的一般形式为: $$|A_1\cup A_2\cup...\cup A_n|=\sum\limits_{1\le i\le n}|A_

[BZOJ 3622]已经没有什么好害怕的了(Dp+容斥原理)

Description 图片略 Solution 对啊,已经没有什么好害怕的了 没有头的麻美学姐还是很萌的(雾 排序预处理p[i]为b中小于a[i]的最大的数的标号 f[i][j]表示前i个糖果使得糖果大于药片的至少有j组 则f[i][j]=f[i-1][j]+f[i-1][j-1]*(p[i]-j+1) 容斥得g[j]=f[n][j]*(n-j)!-∑g[k]*C(j,k) (j+1<=k<=n) #include<iostream> #include<cstdio>