bzoj2302-Problem c
题意
有 \(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]\) 中的方案数,显然有转移
\]
考虑上已经钦定的人,就是将总可选人数减少,要求改为 \(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的更多相关文章
- 【BZOJ2302】[HAOI2011]Problem C(动态规划)
[BZOJ2302][HAOI2011]Problem C(动态规划) 题面 BZOJ 洛谷 题解 首先如果\(m=0\)即没有特殊限制的话,那么就和这道题目基本上是一样的. 然而这题也有属于这题的性 ...
- [bzoj2302][HNOI2011]problem c 递推,dp
[HAOI2011]Problem c Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 949 Solved: 519[Submit][Status] ...
- BZOJ2302 [HAOI2011]Problem c
Description 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了, ...
- BZOJ2302 [HAOI2011]Problem c 【dp】
题目 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1,a ...
- 1199 Problem B: 大小关系
求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...
- 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 ...
- C - NP-Hard Problem(二分图判定-染色法)
C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144 ...
- Time Consume Problem
I joined the NodeJS online Course three weeks ago, but now I'm late about 2 weeks. I pay the codesch ...
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
- hdu1032 Train Problem II (卡特兰数)
题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能. (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...
随机推荐
- SpringBoot日记——Web开发篇
准备开始实战啦!~~~~ 我们先来看,SpringBoot的web是如何做web开发的呢?通常的步骤如下: 1.创建springboot应用,指定模块: 2.配置部分参数配置: 3.编写业务代码: 为 ...
- 什么是Gradle
一.什么是Gradle 简单的说,Gradle是一个构建工具,它是用来帮助我们构建app的,构建包括编译.打包等过程.我们可以为Gradle指定构建规则,然后它就会根据我们的“命令”自动为我们构建ap ...
- [环境配置]Ubuntu16.04下编译安装gcc6.3.0
上一篇的SVS要用gcc6.3编译,否则结果不正确,本来以为gcc很好装,结果发现用apt-get安装gcc6只能安装6.5版本,代码作者奇特的要求只能用gcc6.3,没办法只能用源码装了,期间碰见了 ...
- java高并发之锁的使用以及原理浅析
锁像synchronized同步块一样,是一种线程同步机制.让自Java 5开始,java.util.concurrent.locks包提供了另一种方式实现线程同步机制——Lock.那么问题来了既然都 ...
- Oracle数据库之分组查询及排序
分组查询:使用 group by 来设置分组,把该列具有相同值的多条记录当成一组记录来处理,然后只会输出一条记录,得到的结果会默认使用升序的方式进行排列. 规则: (1)如果使用了分组函数,或者是 g ...
- SICP读书笔记 3.5
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- Netty源码分析第2章(NioEventLoop)---->第1节: NioEventLoopGroup之创建线程执行器
Netty源码分析第二章: NioEventLoop 概述: 通过上一章的学习, 我们了解了Server启动的大致流程, 有很多组件与模块并没有细讲, 从这个章开始, 我们开始详细剖析netty的各个 ...
- 【探路者】Beta发布用户使用报告
用户数量:18 一.用户列表及评论. 用户序号 用户来源 用户下载软件途径 用户姓名 用户描述(信息) 使用次数 用户评价 1 张恩聚 QQ发送可运行jar包 周楠 吉林大学在读研究生 5 ...
- 【CSAPP笔记】1. 位、字节、整型
<Computer Systems a Programmer's Perspective>,机械工业出版社.中文译名<深入理解计算机系统>.作者:(美)Randal E.Bry ...
- Prim's Algorithm & Kruskal's algorithm
1. Problem These two algorithm are all used to find a minimum spanning tree for a weighted undirecte ...