[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 ...
随机推荐
- POJ - 2689 Prime Distance (区间筛)
题意:求[L,R]中差值最小和最大的相邻素数(区间长度不超过1e6). 由于非素数$n$必然能被一个不超过$\sqrt n$的素数筛掉,因此首先筛出$[1,\sqrt R]$中的全部素数,然后用这些素 ...
- 【HDU2204】Eddy's爱好
题目大意:求从 1 到 N 中共有多少个数可以表示成 \(M^K,K \gt 1\).\(N \le 1e18\) 题解: 发现 N 很大,若直接枚举 M 的话有 1e9 级别的数据量,肯定超时,因此 ...
- python进阶ing——创建第一个Tornado应用
python进阶ing——创建第一个Tornado应用 分类: Python2013-06-02 23:02 1725人阅读 评论(2) 收藏 举报 pythonTornado 每天在群里跟很多群友讨 ...
- qt5--QLabel标签控件
需要 #include <QLabel> label->setFrameShape(QFrame::Box); //设置边框 边框样式参看:https://www.cnblo ...
- count(列) count(*)
总结:但是真的结论是这样的么.其实不然.其实在数据库中count(*)和count(列)根本就是不等价的,count(*)是针对于全表的,而count(列)是针对于某一列的,如果此列值为空的话,cou ...
- 在window环境下安装numpy模块(包)
刚开始接触python,安装numpy着实费了不少劲.总结一下,新人少走弯路. numpy作用: 是一个 Python 包. 它代表 “Numeric Python”. 它是一个由多维数组对象和用于处 ...
- QT5 Even 事件
事件的引入: 实现功能: 1.点击button 文本框两字改变成button被按下;很简单的在button上转到槽对lineEdit->setTest()设置即可; void myWidget: ...
- Word:转换PDF
本文适用于Word 2007 + Windows 7,造冰箱的大熊猫@cnblogs 2018/8/3 一.Word文档转PDF文档 把Word文档转换为PDF,有两个免费解决方案 1.Microso ...
- 51 Nod 1086 多重背包问题(单调队列优化)
1086 背包问题 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放 ...
- HGOI20190808 省常中互测1
Problem A sum 给出$n$个元素的序列$\{a_i\}$,求出两个不相交连续子序列的最大元素和. 即对于$1 \leq A \leq B \leq C \leq D \leq n$最大化 ...