题目传送

首先对两个数组排序。

然后预处理出数组p[i]表示b[x]<a[i]的最大的x。

然后我们设f[i][k]表示对于前i个派,我单独选出来k组a[y]>b[y]。(即此时有k组a>b的匹配,其余还未匹配)

显然f[i][k]=f[i-1][k]+f[i-1][k-1]*(p[i]-(k-1))。等号右边的第一项相当于考虑a[i]不分配b,第二项相当于a[i]分配b。

这里还要注意一下f[0][0]=f[1][0]=f[2][0]=...=ff[n][0]=1的边界条件。

但是这个数组肯定不是答案。因为这里f[i][k]中保证了只考虑到A的前i个,B的所有位置,并且满足只给A>B的k个A分配了B, 其余A和B没有配对。

我们可以再设g[i]表示对于前n个派,恰好有i组a[x]>b[x]的方案数。

借助容斥原理思考一番后,可得转移方程:

  g[i]=f[n][i]*(n-i)!-  g[j]*c(j,i)   (i+1<=j<=n,c是组合数)。

这里等号右边的第一项相当于只分配了B的i个A的方案数*没分配B的(n-i)个A分配B的方案数(阶乘项)。这是是所有a>b的匹配对数>=i对的方案数,但注意这里可能会出现同一种分配多次出现的情况(比如3个位置,1、2分配了1、2  ,  3对应3;1、3分配了1、3  ,  2对应2),所以要减掉的g[j]还要乘上个组合数来减掉重复出现的方案数。

考虑最终答案是什么。“A 做的苹果派比 B 做的苹果派美味的天数比 B 做的比 A 做的美味的天数恰好多 k。”设A 做的苹果派比 B 做的苹果派美味的天数为x, B 做的比 A 做的美味的天数为y。则有方程组:

x+y=n;

x-y=k;

解得x=(n+k)/2

由此知道的答案即为g[(n+k)/2],同时知道当(n+k)为奇数时是无解的。

 #include<iostream>
#include<cstdio>
#include<algorithm> using namespace std; const int N=; typedef long long LL; const LL mod=1e9+; int n,k,a[N],b[N],p[N],s; LL jc[N],f[N][N],g[N],c[N][N]; char ch; inline int read()
{
int x=;
ch=getchar();
while(!isdigit(ch))
ch=getchar();
while(isdigit(ch))
x=(x<<)+(x<<)+(ch^),ch=getchar();
return x;
} inline void init()
{
jc[]=jc[]=;
for(int i=;i<=n;++i)
jc[i]=jc[i-]*i%mod;
c[][]=;
for(int i=;i<=n;++i)
{
c[i][]=;
for(int j=;j<=i;++j)
c[i][j]=(c[i-][j-]+c[i-][j])%mod;
}
} int main()
{
n=read(),k=read();
for(int i=;i<=n;++i)
a[i]=read();
for(int i=;i<=n;++i)
b[i]=read();
if((n+k)&)
{
cout<<;
return ;
}
s=(n+k)>>;
sort(a+,a++n);
sort(b+,b++n);
int las=;
for(int i=;i<=n;++i)
{
while(b[las+]<a[i]&&las+<=n)
las++;
p[i]=las;
}
init();
f[][]=;
for(int i=;i<=n;++i)
{
f[i][]=;
for(int j=;j<=i;++j)
f[i][j]=(f[i-][j]+f[i-][j-]*(p[i]-j+))%mod;
}
g[n]=f[n][n];
for(int i=n-;i>=s;--i)
{
g[i]=f[n][i]*jc[n-i]%mod;
for(int j=i+;j<=n;++j)
g[i]=(g[i]-g[j]*c[j][i])%mod;
if(g[i]<)
g[i]+=mod;
}
printf("%lld",g[s]);
return ;
}

AC代码

这个DP在考场上几乎没有人写出来。为什么这么难?我再次略总结一下:

1、这个DP出现了不只一个转移方程,即一个转移方程解决不了这个问题, 必须要分步处理,每一步都是个DP。我们做这个题,要考虑怎么分步、步骤之间的联系、每步的处理方式。而这就很难想了。

2、用到了容斥原理的数学知识,对数学基础不行的同学(尤其是作者)极为不友好。

lcez校内模拟赛: 小R与苹果派——题解的更多相关文章

  1. 【20170521校内模拟赛】热爱生活的小Z

    学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...

  2. Java 第十一届 蓝桥杯 省模拟赛 小明植树(DFS)

    小明植树 题目 问题描述 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗. 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n ...

  3. Java 第十一届 蓝桥杯 省模拟赛 小明的城堡

    小明用积木搭了一个城堡. 为了方便,小明在搭的时候用的是一样大小的正方体积本,搭在了一个 n 行 m 列的方格图上,每个积木正好占据方格图的一个小方格. 当然,小明的城堡并不是平面的,而是立体的.小明 ...

  4. 洛谷 U96762 小R与三角形 题解

    U96762 小R与三角形 原题链接 题目描述 小 R 所在的小镇有 n 个村落,这 n 个村落分布在一个圆周上,这些村落之间两两有直达的小路,小路可能相交,但不存在三条路交于一点.现在小 R 正好放 ...

  5. 【20170920校内模拟赛】小Z爱学习

    所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description ​ 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...

  6. Java实现蓝桥杯第十一届校内模拟赛

    有不对的地方欢迎大佬们进行评论(ง •_•)ง 多交流才能进步,互相学习,互相进步 蓝桥杯交流群:99979568 欢迎加入 o( ̄▽ ̄)ブ 有一道题我没写,感觉没有必要写上去就是给你多少MB然后求计 ...

  7. 6.10 省选模拟赛 小C的利是 高斯消元 矩阵行列式

    LINK:小C的利是 想起来把这道题的题解写了 .一个常识:利是在广东那边叫做红包. 关于行列式的题目 不过我不太会23333..口胡还是可以的. 容易想到10分的状压.不过没什么意思. 仔细观察要求 ...

  8. 5.19 省选模拟赛 小B的夏令营 概率 dp 前缀和优化dp

    LINK:小B的夏令营 这道题是以前从没见过的优化dp的方法 不过也在情理之中. 注意读题 千万不要像我这个sb一样 考完连题意都不知道是啥. 一个长方形 要求从上到下联通的概率. 容易发现 K天只是 ...

  9. 5.19 省选模拟赛 小B的图 最小生成树 LCT

    LINK:小B的图 这道题就比较容易了. 容易想到将询问离线 然后 从小到大排序 那么显然是优先放正图(x+k)的边. 考虑随着x的增大 那么负图上的边会逐渐加进来 一条边被加进来当且仅当 其权值小于 ...

随机推荐

  1. 说一下redis中5种数据类型的底层数据结构

      前言: 阅读 redis设计与实现 一书的记录.未完待续... redis我们都知道有5种数据类型,分别是string,list,hash,set,zset,那么你知道它们的底层数据结构实现吗? ...

  2. HDU 4253-Two Famous Companies(二分+最小生成树)

    Description In China, there are two companies offering the Internet service for the people from all ...

  3. const和static const的区别(未整理)

    对于C/C++语言来讲,const就是只读的意思,只在声明中使用;static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调 ...

  4. python_0基础开始_day06

    第六节 1.小数据池 ==,is,id ==:查看等号两边的值是否一样 a = 9b = 9print(a == b) # 返回Truec = "dog"d = "dog ...

  5. solr学习笔记-增加mmesg4J中文分词

    solr版本6.1.centos6.7.mmesg4j版本2.30 solr安装目录:/usr/local/solr-6.1.0 1.下载mmesg4j包: 地址:https://github.com ...

  6. 最新省市区地区数据sql版本(2019年1月)

    版本 统计标准2017版 来源 http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/ 建表 CREATE TABLE `area` ( `id` varc ...

  7. C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)

    希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...

  8. mybatis-plus简单了解

    mybatis-plus入门了解和简单使用 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 特性: ...

  9. 浏览器进程线程时间循环、与vue netTick的实现原理

    浏览器事件循环(结合vue nextTick)https://juejin.im/post/5cb736c5f265da039955d4e8#comment messageChanel的讲解https ...

  10. postMessage解决iframe跨域问题

    转:https://juejin.im/post/5b8359f351882542ba1dcc31 https://juejin.im/post/590c3983ac502e006531df11 ht ...