Description

  

  在一个长度为m的序列中选出n个区间,这些区间互不包含,且至少有一个区间的左端点为x。

  

  问有多少种方案,注意交换两个区间的顺序视为不同方案。

  

​  答案很大,输出模1000000007后的值。

  

Input

  

  一行三个整数n,m,x

  

Output

  

  一行一个整数,表示答案

  

Sample Input

  

​  2 3 3

  

Sample Output

  

​  6

  

HINT

  

​  对于30%的数据,nm<=20

  

  对于100%的数据,n
m<=100000

  

​  (实际上,\(n,m\le 400\))

  

  

  

  

Solution

  

  尝试使用DP解决。

  

  每一个区间的构成分两次事件:从某位置开始,并于某一位置关闭。

  

  我们想象一下从左往右扫描的过程,当前扫描位置的左端有许多等待关闭的区间,因为区间不可重叠,我们可以得到两个性质:首先显然区间的开始位置不可共用;其次如果我们要关闭一个区间,必然关闭的是开始位置最靠前的区间,因此任意时刻关闭区间的选择是唯一的。

  

​  设\(f_{i,j,k}\)表示当前进行到第\(i\)位,已经引出了\(j\)个区间(不管是否关闭),并且有\(k\)个区间等待关闭。

  

  由\(f_{i,j,k}\)出发,有4种转移:(i+1处是否开启一个区间)*(i+1处是否关闭最靠前的区间),转移即可。

  

​  如果i+1即下一个位置是\(x\),则只能进行(i+1处必须开启一个区间)*(i+1处是否关闭最靠前的区间)=2种转移。

  

  

  

Code

#include <cstdio>
#include <cstring>
using namespace std;
const int MOD=1e9+7;
int n,m,x;
int f[2][405][405];
inline int mul(int x,int y){return 1LL*x*y%MOD;}
inline void upd(int &x,int y){(x+=y)%=MOD;}
inline void swap(int &x,int &y){x^=y^=x^=y;}
int main(){
scanf("%d%d%d",&m,&n,&x);
int u=0,v=1;
f[u][0][0]=1;
for(int i=0;i<n;i++){
for(int j=0;j<=m;j++)
for(int k=0;k<=m;k++)
if(f[u][j][k]){
if(j<m) upd(f[v][j+1][k],f[u][j][k]);
if(j<m&&k<m) upd(f[v][j+1][k+1],f[u][j][k]);
if(i+1!=x&&k) upd(f[v][j][k-1],f[u][j][k]);
if(i+1!=x) upd(f[v][j][k],f[u][j][k]);
}
swap(u,v);
memset(f[v],0,sizeof f[v]);
}
int mt=1;
for(int i=1;i<=m;i++) mt=mul(mt,i);
printf("%d\n",mul(f[u][m][0],mt));
return 0;
}

【XSY1841】Intervals的更多相关文章

  1. 【POJ】【3680】Intervals

    网络流/费用流 引用下题解: lyd: 首先把区间端点离散化,设原来的数值i离散化后的标号是c[i].这样离散化之后,整个数轴被分成了一段段小区间. 1.建立S和T,从S到离散化后的第一个点连容量K, ...

  2. 【poj1201】 Intervals

    http://poj.org/problem?id=1201 (题目链接) 题意 给出n个区间${[ai,bi]}$,要求选出尽可能少的数,使得每个区间i中至少存在${c[i]}$个数. Soluti ...

  3. 【POJ1021】Intervals (最短路解差分约束)

    题目: Sample Input 5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1 Sample Output 6 题意: 我们选数,每个数只能选一次.给定n个条件[ai,bi]和 ...

  4. 【SPOJ116】Intervals

    题目大意:有 N 个区间,在区间 [a, b] 中至少取任意互不相同的 c 个整数.求在满足 N 个区间约束的情况下,至少要取多少个正整数. 题解:差分约束系统模板题. 差分约束系统是对于 N 个变量 ...

  5. 【POJ3680】Intervals(费用流)

    题意:有n条线段,每条有起点,终点和一个权值 要求选取一些线段,使它们的权值和最大,并且使每一个点被覆盖不超过k次 1 ≤ K ≤ N ≤ 200 1 ≤ ai < bi ≤ 100,000, ...

  6. 【题解】Intervals

    题目大意   有\(n\)个区间(\(1 \leq n \leq 200\)),第\(i\)个区间覆盖\((a_{i}, b_{i})\)且有权值\(w_{i}\)(\(1 \leq a_{i} &l ...

  7. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  8. 【POJ 1201 Intervals】

    Time Limit: 2000MSMeamory Limit: 65536K Total Submissions: 27949Accepted: 10764 Description You are ...

  9. 【POJ 1201】 Intervals(差分约束系统)

    [POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS   Memory Limit: ...

随机推荐

  1. xml解析数据信息并实现DBManager操作mysql

      先前一直都是用的直接用加载驱动 然后创建连接进行操作数据 如果我的数据库换了 那么要修改的地方也比较多 不利于维护 所以就想到了将所有配置连接信息都用xml封装起来 以至于我每次都只要修改一下我的 ...

  2. Java 集合基础知识 List/Set/Map

    一.List Set 区别 List 有序,可重复: Set 无序,不重复: 二.List Set 实现类间区别及原理 Arraylist 底层实现使用Object[],数组查询效率高 扩容机制    ...

  3. vscode调试js,安装了nodejs之后还出现无法在Path上找到运行时的node

    vscode 调试js,安装了nodejs之后还出现无法在Path上找到运行时的node. 重启vscode解决

  4. 搭建 Digital Ocean 服务器

    作为程序员,搭建属于自己的服务器可以部署自己的网站,可以配置代理***,了解国际前沿科技:一些高性能的服务器还可以完成一些云计算.深度学习模型的训练任务. DigitalOcean 服务启动 注册 D ...

  5. 富文本(wangEditor框架)的使用教程

    富文本的使用教程(wangEditor框架) 一,相信很多人用过很多富文本的框架,现在我向大家推荐一个很实用的一个富文本框架,具有丰富的功能项,容易使用. 所以本博客介绍这个富文本编辑器的使用哈!觉得 ...

  6. fsck命令详解

    基础命令学习目录首页 本文出自 “airfish2000” 博客,更多命令查看博客: http://airfish2000.blog.51cto.com/10829608/1880801   fsck ...

  7. Hadoop Streaming框架使用(二)

    上一篇文章介绍了Streaming的各种参数,本文具体介绍使用方法. 提交hadoop任务示例: $HADOOP_HOME/bin/hadoop streaming \ -input /user/te ...

  8. fiddler常识汇总

    Fiddler 抓包工具总结   名称 含义 # 抓取HTTP Request的顺序,从1开始,以此递增 Result HTTP状态码 Protocol 请求使用的协议,如HTTP/HTTPS/FTP ...

  9. Daily Scrum9 11.13

    昨天的任务已完成. 今日任务: 姓名 今日任务 时长 徐钧鸿 测试SQL包里的代码 2h 张艺 继续搭建还没搭建完的框架 修复bug 2h 黄可嵩 继续进行搜索响应编写 2h 徐方宇 搭建框架 修改b ...

  10. Buaaclubs的NABC与发布

    NEED: 本项目主要目的是实现一个社团学生公共平台,平台的宗旨是为学生提供信息,为社团提供服务,在社团和学生之间建立联系.经过调查,我们发现了用户的以下需求: 需求一:社团发布信息,同学获知信息 这 ...