2024: [SHOI2009] 舞会

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 368  Solved: 102

Description

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个女生的身高。表示身高的正整数,都不超过 。

Output

输出文件只有一个,即满足n对舞伴中最多只有k对舞伴之间女伴比男伴高的男女搭配方案数。

Sample Input

3 0
178
188
176
168
178
170

Sample Output

4

评分
如果你的输出文件与标准答案完全相符,你将获得该测试点的全部分数,否则得零分。

N< = 200

K< = N

HINT

Source

【分析】

  这题高精度真是太可爱了。【然后我才发现如今大概只有我这种傻逼才会用10进制的高精度,别人都是4位4位做的,搞的我RE,0msTLE,MLE都试了一通。。

  然后就是,跟“已经没有什么好害怕了”无异,具体可以看那篇。

  对于至多k,而不是恰好k,就分成恰好0+恰好1+。。。+恰好k就好了。

  【再表示一下用结构体重载运算符写高精度真的好看很多】

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 210
#define Maxl 210
#define Mod 10000 int a[Maxn],b[Maxn],mx[Maxn]; struct hugeint
{
int w[Maxl],l;
hugeint() {memset(w,,sizeof(w));l=;}
friend hugeint operator + (hugeint x,hugeint y)
{
x.l=max(x.l,y.l);
for(int i=;i<=x.l;i++) x.w[i]=x.w[i]+y.w[i];
for(int i=;i<=x.l;i++) x.w[i+]+=x.w[i]/Mod,x.w[i]%=Mod;
while(x.w[x.l+]!=) x.w[x.l+]+=x.w[x.l+]/Mod,x.w[++x.l]%=Mod;
while(x.w[x.l]==&&x.l>) x.l--;
return x;
}
friend hugeint operator - (hugeint x,hugeint y)
{
for(int i=;i<=x.l;i++) x.w[i]=x.w[i]-y.w[i];
for(int i=;i<=x.l;i++) if(x.w[i]<) x.w[i]+=Mod,x.w[i+]--;
while(x.w[x.l]==&&x.l>) x.l--;
return x;
}
friend hugeint operator * (hugeint x,hugeint y)
{
hugeint ret;ret.l=x.l+y.l;
for(int i=;i<=x.l;i++) for(int j=;j<=y.l;j++) ret.w[i+j]+=x.w[i]*y.w[j];
for(int i=;i<=ret.l;i++) ret.w[i+]+=ret.w[i]/Mod,ret.w[i]%=Mod;
while(ret.w[ret.l+]!=) ret.w[ret.l+]+=ret.w[ret.l+]/Mod,ret.w[++ret.l]%=Mod;
while(ret.w[ret.l]==&&x.l>) ret.l--;
return ret;
}
friend hugeint operator * (hugeint x,int y)
{
for(int i=;i<=x.l;i++) x.w[i]*=y;
for(int i=;i<=x.l;i++) x.w[i+]+=x.w[i]/Mod,x.w[i]%=Mod;
while(x.w[x.l+]!=) x.w[x.l+]+=x.w[x.l+]/Mod,x.w[++x.l]%=Mod;
while(x.w[x.l]==&&x.l>) x.l--;
return x;
}
friend bool operator > (hugeint x,hugeint y)
{
if(x.l!=y.l) return x.l>y.l;
for(int i=x.l;i>=;i++)
{
if(x.w[i]!=y.w[i]) return x.w[i]>y.w[i];
}
}
};
hugeint f[][Maxn],c[Maxn][Maxn],fac[Maxn],g[Maxn];
void clear(hugeint &x) {memset(x.w,,sizeof(x.w));x.l=;} int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) scanf("%d",&b[i]);
sort(a+,a++n);sort(b+,b++n);
mx[]=;
for(int i=;i<=n;i++)
{
mx[i]=mx[i-];
while(b[i]>a[mx[i]+]&&mx[i]<n) mx[i]++;
}
f[][].w[]=f[][].w[]=;
for(int i=;i<=n;i++)
{
int p=i&,pp=p^;
for(int j=;j<=i;j++)
{
f[p][j]=f[pp][j]+f[pp][j-]*max(mx[i]-j+,);
}
}
for(int i=;i<=n;i++) c[i][].w[]=;
for(int i=;i<=n;i++) for(int j=;j<=i;j++) c[i][j]=c[i-][j-]+c[i-][j];
hugeint a1,a2,ans;
fac[].w[]=;
for(int i=;i<=n;i++) fac[i]=fac[i-]*i;
for(int i=;i<=n;i++) g[i]=f[n&][i]*fac[n-i];
for(int i=;i<=k;i++)
{
clear(a1);clear(a2);
for(int j=n;j>=i;j--)
{
if((j-i)&) a2=a2+g[j]*c[j][i];
else a1=a1+g[j]*c[j][i];
if(a1>a2) {a1=a1-a2;clear(a2);}
}
ans=ans+(a1-a2);
}
printf("%d",ans.w[ans.l]);
for(int i=ans.l-;i>=;i--) printf("%04d",ans.w[i]);printf("\n");
return ;
}

2017-04-20 15:29:03

【BZOJ 2024】 2024: [SHOI2009] 舞会 (容斥原理+高精度)的更多相关文章

  1. BZOJ 2024: [SHOI2009] 舞会 [容斥原理 高精度]

    题意:和上题基本一样,求至少k对a>b的方案数.不取模!!! 做k+1遍容斥就行了 高精度超强!!!几乎把所有的都用上了 然后,注意有负数,所以容斥的时候正负分别保存然后再一减就行了 这是我省选 ...

  2. [LuoguP2159][SHOI2009]舞会_动态规划_高精度_排列组合

    舞会 题目链接:https://www.luogu.org/problem/P2159 数据范围:略. 题解: 不会.... 看了题解觉得自己好傻逼啊

  3. BZOJ 2440 完全平方数(莫比乌斯-容斥原理)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2440 题意:给定K.求不是完全平方数(这里1不算完全平方数)的倍数的数字组成的数字集合S ...

  4. bzoj 2656 [Zjoi2012]数列(sequence)(高精度)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2656 [题意] 计算大数递推式 [思路] 高精度 [代码] #include<c ...

  5. bzoj 3198 [Sdoi2013]spring(容斥原理+Hash)

    Description Input Output Sample Input 3 3 1 2 3 4 5 6 1 2 3 0 0 0 0 0 0 4 5 6 Sample Output 2 HINT [ ...

  6. Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1747  Solved: 1015[Submit][Stat ...

  7. Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1774  Solved: 644[Submit][Status] ...

  8. bzoj 4819: [Sdoi2017]新生舞会

    Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...

  9. BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]

    4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...

随机推荐

  1. vue-router.esm.js?fe87:16 [vue-router] Route with name 'page' does not exist

    本文地址:http://www.cnblogs.com/veinyin/p/7910525.html 我的路由配置 { path: '/page', name: page, component: pa ...

  2. UIWebView---iOS-Apple苹果官方文档翻译

    CHENYILONG Blog UIWebView---iOS-Apple苹果官方文档翻译 UIWebView 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博h ...

  3. 【洛谷P2515【HAOI2010】】软件安装

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...

  4. 微信小程序rpx单位

    rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375p ...

  5. 机器学习-kNN-数据归一化

    一.为什么需要数据归一化 不同数据之间因为单位不同,导致数值差距十分大,容易导致预测结果被某项数据主导,所以需要进行数据的归一化. 解决方案:将所有数据映射到同一尺度 二.最值归一化 normaliz ...

  6. [001] leap_stage

    [Description] There is a number in each stages that indicates the most stages you can leap up. Now, ...

  7. centos7安装lamp

    一.准备工作 1.   下载并安装CentOS7.2,配置好网络环境,确保centos能上网,可以获取到yum源. centos7.2的网络配置: vim /etc/sysconfig/network ...

  8. Ubuntu 各版本的几个国内更新源

    Ubuntu 国内更新源(各版本通用) 前言:为了下载更方便,速度更快,我们在使用Linux系列系统时修改 apt源 为国内的源 1.复制源文件备份,以防万一 修改文件sources.list,在目录 ...

  9. Linux中如何配置IP相关文件

    Linux中如何配置IP 与网络相关的文件:1) /etc/sysconfig/network   设置主机名称及能否启动Network2) /etc/sysconfig/network-script ...

  10. Educational Codeforces Round 25 D - Suitable Replacement(贪心)

    题目大意:给你字符串s,和t,字符串s中的'?'可以用字符串t中的字符代替,要求使得最后得到的字符串s(可以将s中的字符位置两两交换,任意位置任意次数)中含有的子串t最多. 解题思路: 因为知道s中的 ...