lcez校内模拟赛: 小R与苹果派——题解
首先对两个数组排序。
然后预处理出数组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与苹果派——题解的更多相关文章
- 【20170521校内模拟赛】热爱生活的小Z
学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...
- Java 第十一届 蓝桥杯 省模拟赛 小明植树(DFS)
小明植树 题目 问题描述 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗. 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n ...
- Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
小明用积木搭了一个城堡. 为了方便,小明在搭的时候用的是一样大小的正方体积本,搭在了一个 n 行 m 列的方格图上,每个积木正好占据方格图的一个小方格. 当然,小明的城堡并不是平面的,而是立体的.小明 ...
- 洛谷 U96762 小R与三角形 题解
U96762 小R与三角形 原题链接 题目描述 小 R 所在的小镇有 n 个村落,这 n 个村落分布在一个圆周上,这些村落之间两两有直达的小路,小路可能相交,但不存在三条路交于一点.现在小 R 正好放 ...
- 【20170920校内模拟赛】小Z爱学习
所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...
- Java实现蓝桥杯第十一届校内模拟赛
有不对的地方欢迎大佬们进行评论(ง •_•)ง 多交流才能进步,互相学习,互相进步 蓝桥杯交流群:99979568 欢迎加入 o( ̄▽ ̄)ブ 有一道题我没写,感觉没有必要写上去就是给你多少MB然后求计 ...
- 6.10 省选模拟赛 小C的利是 高斯消元 矩阵行列式
LINK:小C的利是 想起来把这道题的题解写了 .一个常识:利是在广东那边叫做红包. 关于行列式的题目 不过我不太会23333..口胡还是可以的. 容易想到10分的状压.不过没什么意思. 仔细观察要求 ...
- 5.19 省选模拟赛 小B的夏令营 概率 dp 前缀和优化dp
LINK:小B的夏令营 这道题是以前从没见过的优化dp的方法 不过也在情理之中. 注意读题 千万不要像我这个sb一样 考完连题意都不知道是啥. 一个长方形 要求从上到下联通的概率. 容易发现 K天只是 ...
- 5.19 省选模拟赛 小B的图 最小生成树 LCT
LINK:小B的图 这道题就比较容易了. 容易想到将询问离线 然后 从小到大排序 那么显然是优先放正图(x+k)的边. 考虑随着x的增大 那么负图上的边会逐渐加进来 一条边被加进来当且仅当 其权值小于 ...
随机推荐
- rabbitmq五种消息模型整理
目录 0. 配置项目 1. 基本消息模型 1.1 生产者发送消息 1.2 消费者获取消息(自动ACK) 1.3 消息确认机制(ACK) 1.4 消费者获取消息(手动ACK) 1.5 自动ACK存在的问 ...
- Linux-1.1root初始密码设置,切换root用户
Ubuntu安装好后,root密码需要自己设置 root初始密码设置 sudo passwd root 权限不够时,切换root su 回车后输入密码 exit 退出登录的账户
- Codeforces 1220E. Tourism
传送门 这是一道英语题,首先要读懂题目: $\text{Alex believes that his trip will be interesting only if he will not use ...
- 牛客 545A 小A与最大子段和 & CF 660F Bear and Bowling 4
大意: 给定序列$a$, 求选择一个子区间$[l,r]$, 使得$\sum\limits_{i=l}^r(i-l+1)a_i$最大. $n\le2e5, |a_i|\le 1e7$. 记$s[i]=\ ...
- 自定义字段的设计与实现(Java实用版)
前言 自定义字段又叫做"开放模型",用户可以根据自已的需求,添加需要的字段,实现个性化定制. 使用自定义字段的目的,使用自定义字段解决哪些问题 如现有一套CRM系统,客户模块中客户 ...
- redis 学习(16)-- redis 持久化
redis 持久化 什么是持久化 redis 将所有数据保持在内存中,对数据的更新将异步地保存在磁盘中 持久化的方式 1. 快照 快照是某时某刻对数据的完整备份. 在: MySQL Dump Redi ...
- TOPK 问题
TOPK 问题 描述 如从海量数字中寻找最大的 k 个,这类问题我们称为 TOPK 问题,通常使用堆来解决: 求前 k 大,用最小堆 求前 k 小,用最大堆 例子 现有列表 [1, 2, 0, 3, ...
- web-CSS居中大全
居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ...
- groovy程序设计
/********* * groovy中Object类型存在隐式转换 可以不必使用as强转 */ Object munber = 9.343444 def number1 = 2 println mu ...
- Linux安装Redis、PHP安装Redis扩展模块
Redis的官方下载: http://redis.io/download 步骤一:下载安装包 步骤二:编译源程序 步骤三:移动文件.便于管理 步骤四:启动 Redis服务 查看是否启动成功 ...