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. ASP.NET Session详解笔记

    (一) 描述 当用户在 Web 应用程序中导航 ASP.NET 页时,ASP.NET 会话状态使您能够存储和检索用户的值.HTTP 是一种无状态协议.这意味着 Web 服务器会将针对页面的每个 HTT ...

  2. 20155117王震宇 2016-2017-2 《Java程序设计》第九周学习总结

    教材学习内容总结 JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据 ...

  3. NB二人组(二)----归并排序

    归并排序的思路: 归并算法程序(配合下图进行思考): def merge(li,low,mid,high): i = low j = mid + 1 ltmp=[] while i <= mid ...

  4. 去除\ufeff的解决方法,python语言

    语言:python 编程工具:pycharm 硬件环境:win10 64位 读取文件过程中发现一个问题:已有记事本文件(非空),转码 UTF-8,复制到pycharm中,在开始位置打印结果会出现  \ ...

  5. HDU 6205 2017沈阳网络赛 思维题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6205 题意:给你n堆牌,原本每一堆的所有牌(a[i]张)默认向下,每次从第一堆开始,将固定个数的牌(b ...

  6. 设计模式之笔记--解释器模式(Interpreter)

    解释器模式(Interpreter) 定义 解释器模式(Interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 类图 描述 Expr ...

  7. Windows下Oracle数据库自动备份批处理脚本

    expdb命令版本 @echo off REM ########################################################### REM # Windows Se ...

  8. Tutorial 3: Class-based Views

    转载自:http://www.django-rest-framework.org/tutorial/3-class-based-views/ Tutorial 3: Class-based Views ...

  9. 登陆记录utmp wtmp

    /var/log/wtmp文件的作用     /var/log/wtmp也是一个二进制文件,记录每个用户的登录次数和持续时间等信息.   查看方法:   可以用last命令输出当中内容: debian ...

  10. 查看wtmp(登陆信息的内容)

      /var/log/wtmp文件的作用     /var/log/wtmp也是一个二进制文件,记录每个用户的登录次数和持续时间等信息.   查看方法:   可以用last命令输出当中内容: debi ...