HDOJ 2888 Check Corners
2014-02-18 18:06
281 查看
二维RMQ模板。。。。
Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1552 Accepted Submission(s): 569
Problem Description
Paul draw a big m*n matrix A last month, whose entries Ai,j are all integer numbers ( 1 <= i <= m, 1 <= j <= n ). Now he selects some sub-matrices, hoping to find the maximum number. Then he finds that there may be more than one maximum number, he also wants
to know the number of them. But soon he find that it is too complex, so he changes his mind, he just want to know whether there is a maximum at the four corners of the sub-matrix, he calls this “Check corners”. It’s a boring job when selecting too many sub-matrices,
so he asks you for help. (For the “Check corners” part: If the sub-matrix has only one row or column just check the two endpoints. If the sub-matrix has only one entry just output “yes”.)
Input
There are multiple test cases.
For each test case, the first line contains two integers m, n (1 <= m, n <= 300), which is the size of the row and column of the matrix, respectively. The next m lines with n integers each gives the elements of the matrix which fit in non-negative 32-bit integer.
The next line contains a single integer Q (1 <= Q <= 1,000,000), the number of queries. The next Q lines give one query on each line, with four integers r1, c1, r2, c2 (1 <= r1 <= r2 <= m, 1 <= c1 <= c2 <= n), which are the indices of the upper-left corner
and lower-right corner of the sub-matrix in question.
Output
For each test case, print Q lines with two numbers on each line, the required maximum integer and the result of the “Check corners” using “yes” or “no”. Separate the two parts with a single space.
Sample Input
4 4
4 4 10 7
2 13 9 11
5 7 8 20
13 20 8 2
4
1 1 4 4
1 1 3 3
1 3 3 4
1 1 1 1
Sample Output
20 no
13 no
20 yes
4 yes
Source
2009 Multi-University Training
Contest 9 - Host by HIT
Recommend
gaojie
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int dp[10][10][310][310],mp[310][310],n,m;
void RMQ_2D_init()
{
int mx=floor(log(n+0.0)/log(2.0));
int my=floor(log(m+0.0)/log(2.0));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
dp[0][0][i][j]=mp[i][j];
for(int i=0;i<=mx;i++)
{
for(int j=0;j<=my;j++)
{
if(i==0&&j==0) continue;
for(int row=1;row+(1<<i)-1<=n;row++)
{
for(int col=1;col+(1<<j)-1<=m;col++)
{
if(i==0)
dp[i][j][row][col]=max(dp[i][j-1][row][col],dp[i][j-1][row][col+(1<<(j-1))]);
else
dp[i][j][row][col]=max(dp[i-1][j][row][col],dp[i-1][j][row+(1<<(i-1))][col]);
}
}
}
}
}
int RMQ_2D(int x1,int y1,int x2,int y2)
{
int mx=floor(log(x2-x1+1.0)/log(2.0));
int my=floor(log(y2-y1+1.0)/log(2.0));
int m1=dp[mx][my][x1][y1];
int m2=dp[mx][my][x2-(1<<mx)+1][y2-(1<<my)+1];
int m3=dp[mx][my][x1][y2-(1<<my)+1];
int m4=dp[mx][my][x2-(1<<mx)+1][y1];
return max(max(m1,m2),max(m3,m4));
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&mp[i][j]);
RMQ_2D_init();
int q;
scanf("%d",&q);
while(q--)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int mmd=RMQ_2D(x1,y1,x2,y2);
printf("%d",mmd);
if(mmd==mp[x1][y1]||mmd==mp[x2][y2]||mmd==mp[x2][y1]||mmd==mp[x1][y2]) puts(" yes");
else puts(" no");
}
}
return 0;
}
Check Corners
Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1552 Accepted Submission(s): 569
Problem Description
Paul draw a big m*n matrix A last month, whose entries Ai,j are all integer numbers ( 1 <= i <= m, 1 <= j <= n ). Now he selects some sub-matrices, hoping to find the maximum number. Then he finds that there may be more than one maximum number, he also wants
to know the number of them. But soon he find that it is too complex, so he changes his mind, he just want to know whether there is a maximum at the four corners of the sub-matrix, he calls this “Check corners”. It’s a boring job when selecting too many sub-matrices,
so he asks you for help. (For the “Check corners” part: If the sub-matrix has only one row or column just check the two endpoints. If the sub-matrix has only one entry just output “yes”.)
Input
There are multiple test cases.
For each test case, the first line contains two integers m, n (1 <= m, n <= 300), which is the size of the row and column of the matrix, respectively. The next m lines with n integers each gives the elements of the matrix which fit in non-negative 32-bit integer.
The next line contains a single integer Q (1 <= Q <= 1,000,000), the number of queries. The next Q lines give one query on each line, with four integers r1, c1, r2, c2 (1 <= r1 <= r2 <= m, 1 <= c1 <= c2 <= n), which are the indices of the upper-left corner
and lower-right corner of the sub-matrix in question.
Output
For each test case, print Q lines with two numbers on each line, the required maximum integer and the result of the “Check corners” using “yes” or “no”. Separate the two parts with a single space.
Sample Input
4 4
4 4 10 7
2 13 9 11
5 7 8 20
13 20 8 2
4
1 1 4 4
1 1 3 3
1 3 3 4
1 1 1 1
Sample Output
20 no
13 no
20 yes
4 yes
Source
2009 Multi-University Training
Contest 9 - Host by HIT
Recommend
gaojie
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int dp[10][10][310][310],mp[310][310],n,m;
void RMQ_2D_init()
{
int mx=floor(log(n+0.0)/log(2.0));
int my=floor(log(m+0.0)/log(2.0));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
dp[0][0][i][j]=mp[i][j];
for(int i=0;i<=mx;i++)
{
for(int j=0;j<=my;j++)
{
if(i==0&&j==0) continue;
for(int row=1;row+(1<<i)-1<=n;row++)
{
for(int col=1;col+(1<<j)-1<=m;col++)
{
if(i==0)
dp[i][j][row][col]=max(dp[i][j-1][row][col],dp[i][j-1][row][col+(1<<(j-1))]);
else
dp[i][j][row][col]=max(dp[i-1][j][row][col],dp[i-1][j][row+(1<<(i-1))][col]);
}
}
}
}
}
int RMQ_2D(int x1,int y1,int x2,int y2)
{
int mx=floor(log(x2-x1+1.0)/log(2.0));
int my=floor(log(y2-y1+1.0)/log(2.0));
int m1=dp[mx][my][x1][y1];
int m2=dp[mx][my][x2-(1<<mx)+1][y2-(1<<my)+1];
int m3=dp[mx][my][x1][y2-(1<<my)+1];
int m4=dp[mx][my][x2-(1<<mx)+1][y1];
return max(max(m1,m2),max(m3,m4));
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&mp[i][j]);
RMQ_2D_init();
int q;
scanf("%d",&q);
while(q--)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int mmd=RMQ_2D(x1,y1,x2,y2);
printf("%d",mmd);
if(mmd==mp[x1][y1]||mmd==mp[x2][y2]||mmd==mp[x2][y1]||mmd==mp[x1][y2]) puts(" yes");
else puts(" no");
}
}
return 0;
}
相关文章推荐
- 【二维RMQ】hdu 2888 Check Corners
- 一维RMQ和二维RMQ模板以及用法
- 干IT,知识不更新,你就是在贬值
- Ext下解决无弹出窗口的设计解决办法
- redis--设置redis的dbIndex方法
- 一道题
- ExecutorService子线程返回值获取和exception捕获
- 负数在计算机中的表示
- [Android] View控件显示隐藏动画效果
- 表单控件之select
- Ensemble Approaches分类技术
- 【vSphere系列二】安装 Openfiler 存储
- linux 下DNS配置(主域名正向解析)
- C#之HelloWorld
- 使用ICU库中正则表达式匹配关键字示例
- 观察者模式 - Observer
- 职场攻略:7招告别职场胆小鬼
- 前端_把excel表的数据粘贴到网页table(未测试)
- Ext下多tab的延迟加载问题
- (beginer) 凸包+枚举 UVA 811 - The Fortified Forest