博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj3622: 已经没有什么好害怕的了
阅读量:4947 次
发布时间:2019-06-11

本文共 1780 字,大约阅读时间需要 5 分钟。

想一想就是放n^2,先转化一下变成计算至少要(n+k)/2个糖果大于药片

考虑没有重复,先排下序,然后处理出每个a[i]可以和多少b[i]匹配满足条件

本来我的想法就是直接f[i][j]表示枚举到第i位j个满足条件

结果转移不了,改了改变成f[i][j]表示枚举到第i位至少j个满足条件

然后容斥

————————————————————————————————————

upd:之前讲的不知所云。。。

排完序以后处理出d[i]表示第i个糖果可以和1~第d[i]个药片匹配令糖大于药

我们要算的是匹配到第n颗糖,用了n个药片,有k颗糖>它对应的药片,设它为dp[n][n][k]吧

这个东西不好弄,我们容斥曲线救国

设f[i][j]表示匹配到第i颗糖,和j个药片匹配(对应药片可以重复),且糖均大于药的方案数

对于当前f[i][j],假如我用用过的药,方案数就是f[i-1][j],假如用一个没用过的,就有d[i]-(j-1)种选择

f[i][j]=f[i-1][j]+f[i-1][j-1]*(d[i]-(j-1))

f[n][n]相当于搞出了匹配到第n颗糖,用了n个药片,有n颗糖>它对应的药片,也就是dp[n][n][n]

而其实前面两维是没有用的,只用dp[n]表示匹配到第n颗糖,用了n个药片,至少有n颗糖>它对应的药片即可

那么如何通过dp[n]倒着推出dp[n-1]……dp[k]呢?

假设我们现在要求dp[x],大于x的已经搞完了

既然需要正确匹配x个,那么f[n][x]是表示匹配到第n颗糖,用了x药片,全部糖大于药的方案数,假如换种想法,匹配了这x个药片以后,剩下的n-x颗糖随便乱匹配,此时正确匹配数应该是>=x的

所以首先先选n-x颗糖一一放去那些没有用于匹配的药片那,方案数为(n-x)!

所以f[n][x]*(n-x)!就是n颗糖一一对应,且至少有x颗糖比它对应的药片大的方案数了

然后需要减掉包含在里面正确匹配数==x+1的,减去正确==x+2的……,这就是容斥的思想,注意不是加减交互,因为我们已经算出的是刚好有x+1颗糖大于药的方案数了。

所以dp[x]=f[n][x]*(n-x)!-sigema(i>x)dp[i]*C(i,x) 组合数的意思是在i组正确匹配中,选出x个对于当前是组成那x个正确匹配的,剩下i-x是后面乱选不小心搞出来的

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const LL mod=1e9+9;LL a[2100],b[2100];int d[2100];LL f[2100][2100],dp[2100];LL fac[2100],c[2100][2100];int main(){ freopen("a.in","r",stdin); freopen("a.out","w",stdout); int n,k; scanf("%d%d",&n,&k);k=(n+k)/2; for(int i=1;i<=n;i++)scanf("%lld",&a[i]); for(int i=1;i<=n;i++)scanf("%lld",&b[i]); sort(a+1,a+n+1);sort(b+1,b+n+1); int it=0; for(int i=1;i<=n;i++) { while(a[i]>b[it+1]&&it
=k;i--) { dp[i]=(f[n][i]*fac[n-i])%mod; for(int j=n;j>i;j--) dp[i]=((dp[i]-dp[j]*c[j][i])%mod+mod)%mod; } printf("%lld\n",dp[k]); return 0;}

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/9650667.html

你可能感兴趣的文章
hdu 2531 Catch him (bfs)
查看>>
原生Base64编码/解码(OC与Swift)
查看>>
onblur 事件
查看>>
个人简介
查看>>
42-Remove Nth Node From End of List
查看>>
利用CMake管理QT5.5+VTK6.3+ITK4.8+Opencv3.0工程
查看>>
使用WinDbg分析.dump文件找出CPU占用与内存占用的问题根源
查看>>
Django搭建fastdfs错误
查看>>
mockito简单教程
查看>>
hive小tips(各种解析)
查看>>
pyspider 示例二 升级完整版绕过懒加载,直接读取图片
查看>>
win7 64位 python启动报错:无法启动此程序,因为计算机中丢失api-ms-win-crt-process-l1-1-0.dll...
查看>>
1.7动态输入详解
查看>>
call(),apply(),bind()区别?
查看>>
【转】最通用的分页存储过程SqlServer
查看>>
K8S 日志收集(三):ES 集群安装
查看>>
使用DirectDraw直接显示YUV视频数据 分类: windows...
查看>>
jquery笔记
查看>>
Thinkphp+ajaxFileUpload实现异步图片传输
查看>>
maven run 配置jre VM arguments配置 (转)
查看>>