传送门

其实有一个显然的性质嘛:对于每个数,其实只要考虑它最右能被换到的位置就好了

然后设\(f[i][j]\)表示已经处理完了前\(i-1\)位,当前还有\(j\)个\(1\)可以自由支配(注意这里说的是当前可以自由支配,不是总共可以自由支配的\(1\))

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
void read(int &x) {
char ch; bool ok;
for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
#define rg register
const int maxn=3010,mod=1e9+7;
char ch[maxn];
int n,m,f[maxn][maxn],tot,sum[maxn],las[maxn];
int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int main()
{
read(n),read(m);scanf("%s",ch+1);
for(rg int i=1;i<=n+1;i++){
sum[i]=sum[i-1],las[i]=i;
if(ch[i]=='1')tot++,sum[i]++;
}
for(rg int i=1,x,y;i<=m;i++)read(x),read(y),las[x]=max(las[x],y);
for(rg int i=1;i<=n+1;i++)las[i]=max(las[i],las[i-1]);
f[1][sum[las[1]]]=1;
for(rg int i=1;i<=n;i++)
for(rg int j=0;j<=tot;j++)
if(f[i][j]){
int a=las[i],b=las[i+1];
if(j)f[i+1][j+sum[b]-sum[a]-1]=add(f[i+1][j+sum[b]-sum[a]-1],f[i][j]);
if(las[i]+1-i-j)f[i+1][j+sum[b]-sum[a]]=(f[i+1][j+sum[b]-sum[a]],f[i][j]);
}
printf("%d\n",f[n+1][0]);
}

最新文章

  1. android中回调函数机制完全解析
  2. NetBIOS与Winsock编程接口
  3. 在ROS中使用Python3
  4. phpcms不显示验证码
  5. Sprint(第三天11.16)
  6. HDU 4288 线段树+离散化
  7. http://www.swoole.com/
  8. Node.js:常用工具util
  9. 从零开始学习前端JAVASCRIPT — 5、JavaScript基础BOM
  10. Hdoj 1007 Quoit Design 题解
  11. python装饰器的4种类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类
  12. ArcGIS AddIN异常:无法注册程序集 未能加载文件或程序集&quot;ESRI.ArcGIS.Desktop.Addins&quot;
  13. git commit 时出现:please enter the commit message for your changes
  14. php将多个值的数组去除重复元素
  15. 无线linux应用及配置--wifi配置
  16. php判断正常访问和外部访问
  17. Mysql的学习随笔day2
  18. 用Python操作Named pipe命名管道,实用做法——os.read 或 os.write
  19. Permission denied: mod_fcgid
  20. 初学Direct X(3)

热门文章

  1. 数据库的join查询
  2. unity渲染层级关系小结
  3. [转]CSS遮罩——如何在CSS中使用遮罩
  4. 洛谷【P1104】生日(插入排序版)
  5. MySQL读取各个my.cnf配置文件的先后顺序是:
  6. ORACLE数据库增加表空间大小或给表空间增加数据文件
  7. HDOJ1213(并查集)
  8. HDOJ1059(多重背包)
  9. oracle--pl/sql变量定义----
  10. 7.JasperReports学习笔记7-applet打印