【BZOJ2302】[HAOI2011]Problem C(动态规划)
【BZOJ2302】[HAOI2011]Problem C(动态规划)
题面
题解
首先如果\(m=0\)即没有特殊限制的话,那么就和这道题目基本上是一样的。
然而这题也有属于这题的性质,发现座位数和人数是一样的。
那么一种方案是合法的,当且仅当编号小于等于这个位置\(i\)的人数不小于\(i\)。
首先把不合法直接判掉,考虑存在合法状态的情况。
设\(f[i][j]\)表示有\(j\)个人的编号小于等于\(i\)的方案数。显然\(i\le j\)。
考虑如何转移,我们显然从\(i-1\)转移到\(i\)。那么我们考虑枚举选择的编号恰好为\(i\)的人数。首先被钦定的人是不能动的,能够动的只有不被钦定的人,这一部分枚举人数之后组合转移,而被钦定的人直接转移。
这就做完了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 305
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,MOD;
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
int C[MAX][MAX],f[MAX][MAX],num[MAX];
int main()
{
int T=read();
while(T--)
{
n=read();m=read();MOD=read();
memset(num,0,sizeof(num));
for(int i=1;i<=m;++i)read(),num[read()]+=1;
for(int i=1;i<=n;++i)num[i]+=num[i-1];
bool fl=true;
for(int i=1;i<=n;++i)
if(m-num[i-1]>n-i+1)fl=false;
if(!fl){puts("NO");continue;}
for(int i=0;i<=n;++i)C[i][0]=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
memset(f,0,sizeof(f));
f[0][0]=1;
for(int i=1;i<=n;++i)
for(int j=i-1;j<=n;++j)
for(int k=0;k<=n-m-j+num[i-1];++k)
add(f[i][j+num[i]-num[i-1]+k],1ll*f[i-1][j]*C[n-m-j+num[i-1]][k]%MOD);
printf("YES %d\n",f[n][n]);
}
return 0;
}
【BZOJ2302】[HAOI2011]Problem C(动态规划)的更多相关文章
- BZOJ 2298: [HAOI2011]problem a 动态规划
2298: [HAOI2011]problem a Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnli ...
- 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 ...
- luogu 2519 [HAOI2011]problem a 动态规划+树状数组
发现每一次 $[b[i]+1,n-a[i]]$ 这个区间的分数必须相同,否则不合法. 而一个相同的区间 $[l,r]$ 最多只能出现区间长度次. 于是,就得到了一个 $dp:$ 将每一种区间的出现次数 ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4032 Solved: 1817[Submit] ...
- bzoj 2301: [HAOI2011]Problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 3757 Solved: 1671 [Submit] ...
- HAOI2011 problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 1047 Solved: 434[Submit][ ...
- BZOJ 2301: [HAOI2011]Problem b 莫比乌斯反演
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 1007 Solved: 415[Submit][ ...
- 2301: [HAOI2011]Problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4164 Solved: 1888[Submit] ...
随机推荐
- electron 开发实时加载
第一个方式 cnpm install electron-reload --save-dev cnpm install electron-prebuilt --save-dev require('ele ...
- 蓝牙baseband概述
从蓝牙specispecification中看,基带协议主要分为8个部分来介绍的,分别是概述.物理信道.物理连接.逻辑传输.逻辑连接.封包.比特流的处理.组网行为.这里面会涉及到很多的概念,主要是在概 ...
- [JDBC]ORA-01000: 超出打开游标的最大数(ORA-01000: maximum open cursors exceeded)
问题产生的原因: Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,相当于在数据库中打开了一个cursor.由于oracle对打开的 ...
- Docker(三):Dockerfile 命令详解
上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dockerfile 的使用,这篇文章我们来继续了解 Dockerfile ,学习 Dockerfile 各种命令的使用. Dock ...
- vsftpd虚拟账户配置
1. 概述 FTP是文件传输协议,在内外网的文件传输中使用广泛. 本篇博客主要介绍FTP服务器的部署和测试. 2. 软件环境部署 查看系统是否安装FTP软件(vsftpd),执行命令:rpm -qa ...
- Vue2.0 搭配 axios
1.安装axios $ npm install axios 2.Demo (1)Get // 为给定 ID 的 user 创建请求 axios.get('/user?ID=12345') .then( ...
- C#_Math函数总结
Math.abs() 计算绝对值. Math.acos() 计算反余弦值. Math.asin() 计算反正弦值. Math.atan() 计算反正切值. Math.atan2() 计算从x 坐标轴到 ...
- Daily Scrum NO.9
工作概况 符美潇 昨日完成的工作 1.Daily Scrum.日常会议及日常工作的分配和查收. 2.根据第二小组的要求对数据库表的属性进行修改. 今日工作 1.Daily Scrum.日常会议及日常工 ...
- 《Linux内核设计与实现》读书笔记三
Chapter 18 调 试 18.1 准备开始 1.准备工作: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2.执行foo就会让程序立即产生核心信息转储(dump core). ...
- Leetcode——171.宝石与石头
水题: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. J 中的字母不重复,J 和 S中的所有字符 ...