题意

有 \(n\) 个人,从 1 到 \(i\) 编号。给每个人一个值 \(a_i\) ,他们会按编号从小到大进行如下操作:查看 \(a_i\) 有没有人,若没有就坐进去,否则查看 \(a_i+1\) ……

按照这个方法,若一个人没地方坐,那么这个方案不合法。现在给定一部分人的 \(a_i\) ,对剩下的人有多少种分配 \(a\) 的合法方案。\(n\le 300\) 。

分析

可以看 这篇题解

对奇怪的问题,要找出简单的等价形式

观察一下这个摆放方法,可以发现,若标号大于等于 \(x\) 的个数大于 \(n-x+1\) ,那么一定是不可行的,因为每个人只会往后走。更好看的形式是,若标号小于等于 \(x\) 的个数大于等于 \(x\) ,那么这个方案可行。

必要性显然。下面说明充分性。设满足上述条件的情况下 \(x\) 没有地方坐,那就说明值大于等于 \(a_x\) 的至少有 \(n-a_x+2\) 个,与满足上述要求矛盾。因此标号小于等于 \(x\) 的个数大于等于 \(x\) 等价于有合法解。

那么我们dp这个东西就行啦!

设 \(f[i][j]\) 表示有 \(j\) 个人的值在 \([1,i]\) 中的方案数,显然有转移

\[f[i][j]=\sum _{0\le k\le j}f[i-1][k]\binom {n-k} {j-k}
\]

考虑上已经钦定的人,就是将总可选人数减少,要求改为 \(i\) 之前的至少有 \(j-p_i\) 个,其中 \(p_i\) 为钦定选 \(i\) 之前的个数前缀和。

复杂度为 \(O(n^3)\) 。

代码

#include<bits/stdc++.h>
#define M(x) memset(x,0,sizeof x)
using namespace std;
typedef long long giant;
inline int read() {
int x=0,f=1;
char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=301;
int n,m,b[maxn],f[maxn][maxn],q,c[maxn][maxn],suf[maxn];
inline int Plus(int x,int y) {return ((giant)x+(giant)y)%q;}
inline void Pe(int &x,int y) {x=Plus(x,y);}
inline int Multi(int x,int y) {return (giant)x*y%q;}
inline void work() {
n=read(),m=read(),q=read();
M(f),M(b),M(c),M(suf);
c[0][0]=1;
for (int i=1;i<maxn;++i) for (int j=c[i][0]=1;j<=i;++j) c[i][j]=Plus(c[i-1][j],c[i-1][j-1]);
for (int i=1;i<=m;++i) read(),++b[read()];
for (int i=n;i;--i) if ((suf[i]=suf[i+1]+b[i])>n-i+1) {puts("NO");return;}
for (int i=1;i<=n;++i) b[i]+=b[i-1];
f[0][0]=1;
for (int i=1;i<=n;++i) {
for (int j=0;j<=n;++j) for (int k=0;k<=j;++k) Pe(f[i][j],Multi(f[i-1][k],c[n-m-k][j-k]));
for (int j=0;j<i-b[i];++j) f[i][j]=0;
}
printf("YES %d\n",f[n][n-m]);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
for (int T=read();T--;) work();
return 0;
}

bzoj2302-Problem c的更多相关文章

  1. 【BZOJ2302】[HAOI2011]Problem C(动态规划)

    [BZOJ2302][HAOI2011]Problem C(动态规划) 题面 BZOJ 洛谷 题解 首先如果\(m=0\)即没有特殊限制的话,那么就和这道题目基本上是一样的. 然而这题也有属于这题的性 ...

  2. [bzoj2302][HNOI2011]problem c 递推,dp

    [HAOI2011]Problem c Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 949  Solved: 519[Submit][Status] ...

  3. BZOJ2302 [HAOI2011]Problem c

    Description 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了, ...

  4. BZOJ2302 [HAOI2011]Problem c 【dp】

    题目 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1,a ...

  5. 1199 Problem B: 大小关系

    求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...

  6. No-args constructor for class X does not exist. Register an InstanceCreator with Gson for this type to fix this problem.

    Gson解析JSON字符串时出现了下面的错误: No-args constructor for class X does not exist. Register an InstanceCreator ...

  7. C - NP-Hard Problem(二分图判定-染色法)

    C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:262144 ...

  8. Time Consume Problem

    I joined the NodeJS online Course three weeks ago, but now I'm late about 2 weeks. I pay the codesch ...

  9. Programming Contest Problem Types

        Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...

  10. hdu1032 Train Problem II (卡特兰数)

    题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能.    (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...

随机推荐

  1. 硬盘空间术语:unallocated, unused and reserved

    通过standard reports查看Disk Usage,选中Database,右击,选择Reports->Standard Reports->Disk Space Usage,截图如 ...

  2. html5新特性data_*自定义属性使用

    HTML5规范里增加了一个自定义data属性. 这个自定义data属性的用法非常的简单, 就是你可以往HTML标签上添加任意以 "data-"开头的属性, 这些属性页面上是不显示的 ...

  3. (转)js在数组中删除重复的元素自保留一个(两种实现思路)

    例如:var student = [‘qiang','ming','tao','li','liang','you','qiang','tao']; 第一种思路是:遍历要删除的数组arr, 把元素分别放 ...

  4. CSS过渡动画之transition

    O(∩_∩)O~ 这两天在看看CSS的相关内容,关于transition动画感觉很有意思,分享一下. CSS负责给html加效果,自然少不了各种动画,今天介绍一下transition. 概述 看一段比 ...

  5. Spring是什么?优点是什么?

    大部分项目都少不了Spring的身影,为什么大家对他如此青睐,而且对他的追捧丝毫没有减退之势呢 Spring是什么: Spring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与 ...

  6. 《spark机器学习 第二版》 蔡立宇 分享 pdf下载

    链接:https://pan.baidu.com/s/15Y14eAnfj8zf5mXdixbVeQ 提取码:rkdt

  7. 苏州地区--校招IT公司

    完整经历了苏州的秋招和春招,在本校和苏州大学跑了许多次的宣讲会,自认为对苏州IT企业的校招有一个充分的认知.原本打算在苏州找一份Java开发的工作,可是发现自己简历连那些公司的简历关都过不去(对双非学 ...

  8. selenium 基本常用操作

    from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChains #鼠标操作 ...

  9. VS2017+CMake+OpenCV下报错 set OpenCV_FOUND to FALSE

    问题 在 VS 2017 中使用Cmake 管理项目, 使用 opencv 库, 在find package的时候出现能找到 OpenCVConfig.cmake的文件,但是设置 OpenCV_Fou ...

  10. 拒绝滥用golang defer机制

    原文链接 : http://www.bugclosed.com/post/17 defer机制 go语言中的defer提供了在函数返回前执行操作的机制,在需要资源回收的场景非常方便易用(比如文件关闭, ...