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的增大 那么负图上的边会逐渐加进来 一条边被加进来当且仅当 其权值小于 ...
随机推荐
- ABC136E Max GCD
Thinking about different ways of thinking. --- LzyRapx 题目 思路比较容易想到. Observations: 每次操作过后和不变. 枚举和的因子 ...
- Linux运维必备工具
1. 查看进程占用带宽情况 - Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽. 前提条件:安装c++环境 yum install -y gcc-c++ ...
- python3.7 安装Scrapy 失败问题
python的Scrapy框架,需要Twisted依赖以及VC++ 14 以上的环境,这些就不再赘述.讲讲今天安装Twisted和Scrapy遇到的其他问题. 首先就是直接安装Twisted成功后,安 ...
- Linux中使用curl命令发送带参数的get请求和post请求
GET 请求 curl命令 + 请求接口的地址 curl http://**.**.***.**/SeedAgile/SeedApi/querySprintByRequirementNo?parame ...
- 安装docker私有仓库
先安装docker:http://www.cnblogs.com/cjsblogs/p/8717304.html 安装私有仓库 #下载registry docker pull registry #制作 ...
- Ubuntu18.04 出现E: Sub-process /usr/bin/dpkg returned an error code (100)
You might want to reinstall dpkg by doing the following: sudo -i mkdir /tmp/dpkg cd /tmp/dpkg Mind t ...
- Alibaba开源组件-分布式流量控制框架sentinel初探
Alibaba开源组件-分布式流量控制框架sentinel初探 2018年12月09日 18:23:11 SuperPurse 阅读数 1965更多 分类专栏: J2EE 版权声明:本文为博主原创 ...
- django自带登录认证与登录自动跳转
# 导入django自带模块 from django.contrib.auth import authenticate, login, logout # 使用authenticate进行认证,使用lo ...
- [转载]for、foreach、iterator的用法及效率区别
来源:https://www.jianshu.com/p/bbb220824c9a 1.在形式上 for的形式是 for(int i=0;i<arr.size();i++){...} forea ...
- O003、准备 KVM 实验环境
参考https://www.cnblogs.com/CloudMan6/p/5240770.html KVM 是 OpenStack 使用的最广泛的Hypervisor,本节介绍如何搭建 KVM ...