Hdoj 5181 numbers
numbers
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 196608/196608 K (Java/Others)
Total Submission(s): 156 Accepted Submission(s): 50
This question is quite easy. Therefore I must give you some limits.
There are m limits, each is expressed as a pair<A,B> means the number A must be popped before B.
Could you tell me the number of ways that are legal in these limits?
I know the answer may be so large, so you can just tell me the answer mod 1000000007({10}^{9}+7).
Each test case begins with two integers n(1 \leq n \leq 300) and m(1 \leq m \leq 90000).
Next m lines contains two integers A and B(1 \leq A \leq n,1 \leq B \leq n)
(P.S. there may be the same limits or contradict limits.)
The only legal pop-sequence of case 3 is 1,2,3. The legal pop-sequences of case 4 are 2,3,1 and 2,1,3.
设f[i][j]为数字(i-j)的出栈方案数,显然我们可以枚举最后一个出栈的元素k,i<=k<=j。先把[i,k-1]出栈完了之后,把k放进去,然后再放[k+1,j]
并且出栈后再出k。
所以我们可以得到递推式 f[i][j]=Σf[i][k-1]*f[k+1][j] ,当然因为有限制这里的k显然不能取区间[i,j]的所有数。 当然A,B只能对 L<=min(A,B),R>=max(A,B)的f[L][R]产生影响。
我们发现当A<B时,只要k!=A就是合法的,因为出栈顺序是[i,k-1]->[k+1,j]->k;
而当A>B时,观察出栈顺序也可以发现只要k¢(B,A]就是合法的。 于是现在的问题变成了如何快速判断一个k在对于f[i][j]是否合法。。。。
我们可以发现的是,当把区间的左端点看成横坐标,区间的右端点看成纵坐标的时候,对于一组A、B
不合法的区域就是以(1,max(A,B))为左下角,(min(A,B),n)为右上角的矩形。
虽然这个坐标系只有在直线y=x上方的区域是有用的,但是我们不妨对每个k都做一遍差分,
然后再前缀和一下得到它在哪些区间是不合法的。
这样就可以 O(N^3 + N*M) 完成本题了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int ha=1000000007;
int f[305][305],n,m,T;
int uu,vv,ban[305][305][305];
bool flag; inline int add(int x,int y){
x+=y;
return x>=ha?x-ha:x;
} inline void init(){
memset(f,0,sizeof(f));
memset(ban,0,sizeof(ban));
flag=0;
} inline void matrix(int px1,int py1,int px2,int py2,int num){
ban[num][px1][py1]++;
ban[num][px2+1][py1]--;
ban[num][px1][py2+1]--;
ban[num][px2+1][py2+1]++;
} inline void dp(){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++) ban[i][j][k]+=ban[i][j-1][k]+ban[i][j][k-1]-ban[i][j-1][k-1]; for(int i=1;i<=n;i++) f[i][i]=f[i][i-1]=1;
f[n+1][n]=1; for(int len=1;len<n;len++)
for(int i=1,j;(j=i+len)<=n;i++)
for(int k=i;k<=j;k++) if(!ban[k][i][j]){
f[i][j]=add(f[i][j],f[i][k-1]*(ll)f[k+1][j]%ha);
}
} int main(){
scanf("%d",&T);
while(T--){
init();
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&uu,&vv);
if(uu<vv){
matrix(1,vv,uu,n,uu);
}
else if(uu>vv){
for(int j=vv+1;j<=uu;j++) matrix(1,uu,vv,n,j);
}
else flag=1;
} if(flag){
puts("0");
continue;
} dp(); printf("%d\n",f[1][n]);
} return 0;
}
Hdoj 5181 numbers的更多相关文章
- hdu 5181 numbers
http://acm.hdu.edu.cn/showproblem.php?pid=5181 题意: 有一个栈,其中有n个数1~n按顺序依次进入栈顶,在某个时刻弹出. 其中m个限制,形如数字A必须在数 ...
- hdu 5181 numbers——思路+区间DP
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5181 题解:https://www.cnblogs.com/Miracevin/p/10960717.ht ...
- hdoj 5522 Numbers
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5522 水题:暴力过 #include<stdio.h> #include<strin ...
- HDU.5181.numbers(DP)
题目链接 参考. \(Description\) 将\(1,2,\cdots,n(n\leq 300)\)依次入栈/出栈,并满足\(m(m\leq 90000)\)个形如\(x\)要在\(y\)之前出 ...
- 找规律/数位DP HDOJ 4722 Good Numbers
题目传送门 /* 找规律/数位DP:我做的时候差一点做出来了,只是不知道最后的 is_one () http://www.cnblogs.com/crazyapple/p/3315436.html 数 ...
- HDOJ(HDU).1058 Humble Numbers (DP)
HDOJ(HDU).1058 Humble Numbers (DP) 点我挑战题目 题意分析 水 代码总览 /* Title:HDOJ.1058 Author:pengwill Date:2017-2 ...
- hdoj 2817 A sequence of numbers【快速幂】
A sequence of numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HDOJ(HDU) 2138 How many prime numbers(素数-快速筛选没用上、)
Problem Description Give you a lot of positive integers, just to find out how many prime numbers the ...
- HDOJ 1058 Humble Numbers(打表过)
Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The ...
随机推荐
- opencv中的仿射变换
什么是仿射变换? 原理:1.一个任意的仿射变换都能表示为 乘以一个矩阵(线性变换) 接着再 加上一个向量(平移) 2.综上所述,我们能够用仿射变换来表示: 1)旋转(线性变换) 2)平移(向量加) 3 ...
- 3、CSS基础 part-1
1.给body设置颜色 <html> <body text="red"> <p> hello world</p> <p> ...
- IE hasLayout详解
hasLayout定义 haslayout 是Windows Internet Explorer渲染引擎的一个内部组成部分.在Internet Explorer中,一个元素要么自己对自身的内容进行计算 ...
- python-day4-装饰器的使用
摘要:某公司的基础开发平台,有大概N多个函数,boss要求小A,为每个函数添加权限验证功能,而且要求不得修改函数内部结构,让小A尝试从代码外部入手,作为新手小A来讲,这无疑是一个巨大的工作量,难道TM ...
- Cannot set property 'innerHTML' of null 问题的解决
错误第一次写web 前端代码,出现了“Cannot set property ‘innerHTML’ of null”的错误代码,然后不知道原因在哪? 解决方案在网上查了下资料,原来是js 代码从上往 ...
- ALPHA(五)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- 【转】Unity3D研究院之两种方式播放游戏视频
http://www.xuanyusong.com/archives/1019 Unity3D中播放游戏视频的方式有两种,第一种是在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像 ...
- BZOJ 3456 城市规划 ——NTT
搞出递推式. 发现可以变成三个函数的乘积. 移项之后就可以求逆+NTT做了. miskoo博客中有讲 #include <map> #include <cmath> #incl ...
- 如何将RobotFramework中case的执行结果上传到TestLink中。
公司的需求是: 用RobotFrameworjk框架执行case,用Testlink管理case和测试任务.需要持续统计每个版本的测试结果. 我觉得用Jenkins+Robot也行,Testlink+ ...
- Java 学习(1): windows java 运行& 环境配置
Java 文件的运行 如下,创建了一个 名为"HelloWorld.java" 的 Java 文件: public class HelloWorld { public static ...