题目链接:戳我

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
#define MAXN 8010
#define mod 1000000007
#define ll long long
int n,m,a[MAXN],flag[MAXN],cnt[MAXN],f[2][MAXN],sum[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
int x,y;
scanf("%d%d",&x,&y);
if(a[x]){puts("0");return 0;}
if(flag[y]){puts("0");return 0;}
if(y==n&&x!=n){puts("0");return 0;}
if(x==n&&y!=n){puts("0");return 0;}
a[x]=y;flag[y]=1;//a[x]=y表示位置x预定的是y
}
//f[i][j]表示统计到前i位,其中最大的是j的方案数
//根据题目中的排序规则,最大的一定在最右边
for(int i=1;i<=n;++i) cnt[i]=cnt[i-1]+flag[i];
f[0][0]=1;
for(int i=0;i<=n;++i) sum[i]=1;
for(int i=1;i<=n;++i)
{
int now=i&1,pre=now^1;
memset(f[now],0,sizeof(f[now]));
//j一定在第i位
for(int j=i;j<=n;++j)
{
if(!a[i-1])//i-1的位置没有被预定
{
f[now][j]=((f[now][j]+1ll*f[pre][j]*(j-(i-1)-cnt[j-1])%mod)%mod+sum[j-1])%mod;
//乘上的系数是该位可以放哪些值
}
else if(j>a[i-1])//如果i-1的位置被预定了,且j大于i-1位置预定的值
f[now][j]=(f[pre][j]+f[pre][a[i-1]])%mod;
}
sum[i-1]=0;
for(int j=i;j<=n;++j) sum[j]=(sum[j-1]+(flag[j]?0:f[now][j]))%mod;
//sum[j]表示以1...j为最大的值的前缀和
//如果这个位置被预定了,那么就是0,如果没有,就加上这一位的值
if(a[i])//如果这个位置被预定了
{
flag[a[i]]=0;//a[i]这个数没有预定了,以消除后面统计前缀和的影响
for(int j=a[i];j<=n;++j) --cnt[j];//cnt[j]表示前j大的数已经被放了几个了,同上
}
}
printf("%d\n",f[n&1][n]);
return 0;
}

最新文章

  1. linux yum安装jdk
  2. java之设计模式
  3. 分配给 主机的 Evaluation Mode 许可证已过期。建议升级许可证。
  4. C#产生随机颜色
  5. HDU 2795 单点更新,区间优先查找(想法)
  6. 学习linux必备服务器VPS
  7. Java Servlet-入门
  8. Mybatis使用存储过程(MySql)
  9. WEB ICON 的探讨
  10. ThreadLocal用法和实现原理(转)
  11. 说说JAVA之网络编程 - 爬虫
  12. 【BZOJ1001】狼抓兔子(网络流)
  13. [virtualenv]生产环境中使用virtualenv
  14. python学习——读取染色体长度(四:获取最长染色体的编号)
  15. 关机,重启BAT命令
  16. 最小可用id
  17. [C++]指针和指向数组的指针[一维数组与指针]
  18. Windows向虚拟机Linux传输文件方法
  19. [POI2014]Rally
  20. C# chart控件基础使用

热门文章

  1. pandas字符串与时间序列的处理 str 与 dt
  2. http请求之of_ordering_http_get
  3. CF 666C &amp; 牛客 36D
  4. luogu题解P2486[SDOI2011]染色--树链剖分+trick
  5. ZROI-Day2比赛解题报告
  6. Linux服务器性能检查教程
  7. linux的top下buffer与cache的区别、free命令内存解释
  8. Delphi WaitCommEvent函数
  9. (十二)Linux Kernel suspend and resume
  10. Mac上 intellij IDEA报错:Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk .jdk/Contents/Home/bin/java ( ) and /Library/Java/JavaVirtualMachines/jdk