[SHOI2009] 舞会
OItown要举办了一年一度的超级舞会了,作为主办方的Constantine为了使今年的舞会规模空前,他邀请了许多他的好友和同学去。舞会那天,恰好来了n个男生n个女生。Constantine发现,一般情况下,舞伴之间,总是男伴总是比女伴长得高,不过,偶尔也是有特殊情况的。所以,Constantine现在想知道,如果把这2n个人恰好配成n对舞伴,有多少种搭配方法,而且他要求最多只有k对舞伴之间女伴比男伴高。现在,Constantine需要参加SHTSC的你帮助他算出这个答案,当然啦,他会先告诉你这2n个同学的身高。
Input
第一行:两个整数n、k,含义如问题中所示。
第2行到第n+1行:n个整数,表示n个男生的身高。
第n+2行到第2n+1行:n个整数,表示n个女生的身高。表示身高的正整数,都不超过 。
N< = 200
K< = N
Output
即满足n对舞伴中最多只有k对舞伴之间女伴比男伴高的男女搭配方案数。
Sample Input
3 0
178
188
176
168
178
170
Sample Output
4
Sol:
将最多有K种情况转化成正好1种,正好2种...正好K种
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 205
#define LL long long
using namespace std;
const int bit = 100000000, wei = 8;
int n,m,a[maxn],b[maxn];
struct Big
{
LL s[105];
int len;
Big(){memset(s,0,sizeof s);len=0;}
void print(){
if(!len) {putchar('0');return;}
printf("%lld",s[len-1]);
for(int i=len-2;i>=0;i--) printf("%08lld",s[i]);
}
Big operator + (const Big &B)
{
Big c;c.len=max(len,B.len);
for(int i=0;i<c.len;i++){
c.s[i]+=s[i]+B.s[i];
if(c.s[i]>=bit) c.s[i+1]++,c.s[i]-=bit;
}
if(c.s[c.len]) c.len++;
return c;
}
Big operator - (const Big &B)
{
Big c;c.len=max(len,B.len);
for(int i=0;i<c.len;i++){
c.s[i]+=s[i]-B.s[i];
if(c.s[i]<0) c.s[i+1]--,c.s[i]+=bit;
}
while(!c.s[c.len-1]&&c.len) c.len--;
return c;
}
Big operator * (const Big &B)
{
Big c;c.len=len+B.len;
for(int i=0;i<len;i++) if(s[i])
for(int j=0;j<B.len;j++) if(B.s[j]){
c.s[i+j]+=s[i]*B.s[j];
if(c.s[i+j]>=bit) c.s[i+j+1]+=c.s[i+j]/bit,c.s[i+j]%=bit;
}
while(!c.s[c.len-1]&&c.len) c.len--;
return c;
}
void operator = (int x){while(x) s[len++]=x%bit,x/=bit;}
Big operator * (const int &x){Big B;B=x;return *this*B;}
}f[2][maxn],one,c[maxn][maxn],fac[maxn];
int main()
{
scanf("%d%d",&n,&m);
one=1;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
sort(a+1,a+1+n),sort(b+1,b+1+n);
int now=0;f[now][0]=one;
for(int i=1,p=0;i<=n;i++,now=!now)
{
while(p<n&&b[i]>a[p+1]) p++;
f[!now][0]=f[now][0];
for(int j=1;j<=p;j++) f[!now][j]=f[now][j]+f[now][j-1]*(p-(j-1));
}
fac[0]=one;for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i;
c[0][0]=one;
for(int i=1;i<=n;i++){
c[i][0]=c[i][i]=one;
for(int j=1;j<i;j++) c[i][j]=c[i-1][j-1]+c[i-1][j];
}
for(int i=0;i<=n;i++)
f[now][i]=f[now][i]*fac[n-i];//至少
for(int i=n;i>=0;i--)
for(int j=i+1;j<=n;j++)
f[now][i]=f[now][i]-c[j][i]*f[now][j];//恰好
Big ans;
for(int i=0;i<=m;i++)
ans=ans+f[now][i];
ans.print();
}
[SHOI2009] 舞会的更多相关文章
- 【BZOJ 2024】 2024: [SHOI2009] 舞会 (容斥原理+高精度)
2024: [SHOI2009] 舞会 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 368 Solved: 102 Description OIto ...
- [LuoguP2159][SHOI2009]舞会_动态规划_高精度_排列组合
舞会 题目链接:https://www.luogu.org/problem/P2159 数据范围:略. 题解: 不会.... 看了题解觉得自己好傻逼啊
- BZOJ 2024: [SHOI2009] 舞会 [容斥原理 高精度]
题意:和上题基本一样,求至少k对a>b的方案数.不取模!!! 做k+1遍容斥就行了 高精度超强!!!几乎把所有的都用上了 然后,注意有负数,所以容斥的时候正负分别保存然后再一减就行了 这是我省选 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- NOIP前的刷题记录
因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数 组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- tyvj1192 迎春舞会之集体舞
背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 描述 表演者排成n排,构成一个向前的正三角形(在屏幕上,即向下).而就每个人,他有可能正面朝前(小的向前正三角形).或向后三角形(小的向后正 ...
- tyvj1294 小v的舞会
背景 "梦中伊人,断我男儿几寸柔肠,于断桥,不知西风自憔悴那姑娘."小v的梦中伊人要带领一大帮姐妹MM们来小v家举办舞会,然而怎么安排跳舞的顺序成了大问题,你能帮他么? 描述 有n ...
随机推荐
- Java I/O(二)其他常用的输入输出流PrintStream等、标准流重定向
四.FilterOutputStream.PrintStream PrintStream是继承自FilterStream类的,例如标准输出流System.out就是著名的PrintStream类对象. ...
- centos7安装教程(U盘启动盘制作)
Centos7 系统安装步骤. 1,准备一个8gU盘. 2.iso系统镜像文件. 3.下载UltraISO软件制作启动盘. 点击试用 选中u盘
- 《Python 3标准库》
在本书中,你会看到用来处理文本.数据类型.算法.数学计算.文件系统.网络通信.Internet.XML.Email.加密.并发性.运行时和语言服务等各个方面的实用代码和解决方案.在内容安排上,每一节都 ...
- 通俗易懂的例子解释 IAAS、SAAS、PAAS 的区别
你一定听说过云计算中的三个“高大上”的你一定听说过云计算中的三个“高大上”的概念:IaaS.PaaS和SaaS,这几个术语并不好理解.不过,如果你是个吃货,还喜欢披萨,这个问题就好解决了!好吧,其实你 ...
- Linux——awk
https://blog.csdn.net/jin970505/article/details/79056457 可以根据特定规则输出文本文件内容
- python 创建实例对象
实例化类其他编程语言中一般用关键字 new,但是在 Python 中并没有这个关键字,类的实例化类似函数调用方式. 以下使用类的名称 Employee 来实例化,并通过 __init__ 方法接收参数 ...
- Java多线程和并发(十),JMM(Java内存模型)
目录 1.什么是JMM 2.JMM的主内存和工作内存 3.JMM如何解决可见性问题-指令重排序 4.Volatile 十.JMM(Java内存模型)(暂时没有理解) 1.什么是JMM 2.JMM的主内 ...
- TTTTTTTTTTTTTTTT POJ 2723 楼层里救朋友 2-SAT+二分
Get Luffy Out Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8211 Accepted: 3162 Des ...
- ZOJ-3777-Problem Arrangement(状压DP)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意: 输入n和m,接下来一个n*n的矩阵,a[i][j]表示第i道 ...
- 消息队列rabbitmq/kafka
12.1 rabbitMQ 1. 你了解的消息队列 rabbitmq是一个消息代理,它接收和转发消息,可以理解为是生活的邮局.你可以将邮件放在邮箱里,你可以确定有邮递员会发送邮件给收件人.概括:rab ...