Check Corners

Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 858    Accepted Submission(s): 275

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
 
Recommend
gaojie
 
题目大意:求矩阵子矩阵的最大值
题解:二维RMQ
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#define maxn 309
using namespace std; int n,m,dp[maxn][maxn][][],map[maxn][maxn];
int x,y,xx,yy,q; void RMQ_pre(){
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
dp[i][j][][]=map[i][j];
int mx=log(double(n))/log(2.0);
int my=log(double(m))/log(2.0);
for(int i=;i<=mx;i++){
for(int j=;j<=my;j++){
if(i==&&j==)continue;
for(int row=;row+(<<i)-<=n;row++){
for(int col=;col+(<<j)-<=m;col++){
if(i==)
dp[row][col][i][j]=max(dp[row][col][i][j-],dp[row][col+(<<(j-))][i][j-]);
else
dp[row][col][i][j]=max(dp[row][col][i-][j],dp[row+(<<(i-))][col][i-][j]);
}
}
}
}
} int RMQ_2D(int x,int y,int xx,int yy){
int kx=log(double(xx-x+))/log(2.0);
int ky=log(double(yy-y+))/log(2.0);
int m1=dp[x][y][kx][ky];
int m2=dp[xx-(<<kx)+][y][kx][ky];
int m3=dp[x][yy-(<<ky)+][kx][ky];
int m4=dp[xx-(<<kx)+][y-(<<ky)+][kx][ky];
return max(max(m1,m2),max(m3,m4));
} int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&map[i][j]);
RMQ_pre();
scanf("%d",&q);
while(q--){
scanf("%d%d%d%d",&x,&y,&xx,&yy);
int ans=RMQ_2D(x,y,xx,yy);
printf("%d ",ans);
if(ans==map[x][y]||ans==map[xx][y]||ans==map[xx][yy]||ans==map[xx][yy])
printf("yes\n");
else printf("no\n");
}
}
return ;
}
 

最新文章

  1. python之socket
  2. 完美搞定《DOCKER IN ACTION》第二章示例
  3. javascript双击事件取消默认的两次单击事件
  4. 建立名称server
  5. 【10】令operator=返回一个reference to *this
  6. Git查看、删除、重命名远程分支和tag
  7. readlink
  8. javascript 变量 命名规范 变量的作用域
  9. 构建一个真实的应用电子商务SportsStore9
  10. sql-update语句多表级联更新
  11. jquery无new构建学习笔记
  12. 试着把.net的GC讲清楚(2)
  13. C语言经典算法 - 多维矩阵转一维矩阵的代码
  14. react-native不是内部或 外部命令,也不是可运行的程序或批处理文件
  15. 关于rem布局
  16. 剑指offer例题——用两个栈实现队列
  17. Unity场景渲染相关实现的猜想
  18. python之接口与抽象类
  19. Android集成人脸识别demo分享
  20. Awk 从入门到放弃(5)– Awk模式(Pattern)之一

热门文章

  1. sorted 、 filter 、 map
  2. python之路 内置函数,装饰器
  3. RHEL 5 安装gcc
  4. java的服务端与客户端通信(2)
  5. 【HackerRank】QuickSort(稳定快排,空间复杂度O(n))
  6. ACM训练小结-2018年6月15日
  7. 什么是OOM?如何解决OOM问题!
  8. MapReduce-读取文件写入HBase
  9. Linux嵌入式 -- 内核 - 进程控制 和 调度
  10. libvirt cpu mode