【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] ...
随机推荐
- RabbmitMQ-组成及简单使用
什么是MQ? MQ全程Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ是消费者-生产者模型的典型代表.一端往消息队列中不断写消息而另一端则可以读取队列中的消息. R ...
- Scala学习(五)练习
Scala中的类&练习 1. 改进Counter类,让它不要在Int.MaxValue时变成负数 程序代码: class Counter { private var value=100 def ...
- 《RabbitMQ Tutorial》译文 第 1 章 简介
原文来自 RabbitMQ 英文官网的教程(1.Introduction),其示例代码采用了 .NET C# 语言. RabbitMQ is a message broker: it accepts ...
- Pair Project —— Elevator Scheduler
结对编程人员 12061153 刘丽萍 12061154 冯飘飘 说明结对编程的优点和缺点. 结对编程的优点: 以前都是自己一个人编程,对于相互结对或者团队编程都没有接触过.而自己在写代码时不可避免的 ...
- 201306114357-实验3-C语言
#include<stdio.h>#include <stdlib.h>#include <time.h>main(){ int a,b,c,n,u,i,sum; ...
- Find Amir CodeForces - 805C (贪心+思维)
A few years ago Sajjad left his school and register to another one due to security reasons. Now he w ...
- python2 与 python3 实现共存
已有配置 Anaconda2+python2.7 方案一:直接安装官网原生python3.6 1.修改根目录下python.exe ->python3.exe pythonw.exe - ...
- [BUAA_SE_2017]案例分析-Week3
Week3 案例分析 一.调研评测 案例: 神策数据的数据概览功能 Demo: 电商类产品Demo 评价: d) 好,不错 个人评价:神策数据电商类产品Demo的数据概览功能是相当不错的.首先点击进入 ...
- Activiti流程编辑器针对自定义用户角色表优化改造
本文目的: 针对自定义的用户.角色表,对Activiti的在线流程设计器进行优化改造,使之能直接在图形界面上完成对节点办理人.候选人.候选组的配置,不需要先去查数据库中的用户ID.角色ID等信息再填入 ...
- [wiki]陶德曼调停
陶德曼调停[编辑] 维基百科,自由的百科全书 凯申物流差点和谈 目录 1背景 2调停经过 3评价 4参见 背景[编辑] 主条目:中德合作 (1911年-1941年) 1936年11月25日,德国与日本 ...