Matrix Searching


Time Limit: 10 Seconds     
Memory Limit: 32768 KB


Given an n*n matrix A, whose entries Ai,j are integer numbers ( 1 <= i <= n, 1 <= j <= n ). An operation FIND the minimun number in a given ssub-matrix.

Input

The first line of the input contains a single integer T , the number of test cases.

For each test case, the first line contains one integer n (1 <= n <= 300), which is the sizes of the matrix, respectively. The next n lines with n integers each gives the elements of the matrix.

The next line contains a single integer N (1 <= N <= 1,000,000), the number of queries. The next N lines give one query on each line, with four integers r1, c1, r2, c2 (1 <= r1 <= r2 <= n, 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 N lines with one number on each line, the required minimum integer in the sub-matrix.

Sample Input

1

2

2 -1

2 3

2

1 1 2 2

1 1 2 1

Sample Output

-1

2


Author: PENG, Peng

Source: ZOJ Monthly, June 2007

帮学妹找了一晚上的bug。,,各种调试,。各种报错,。感觉自己水爆了,,赶紧水道高级点的水题压压惊~~

ac代码

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. #define max(a,b) (a>b?a:b)
  5. #define min(a,b) (a>b?b:a)
  6. int map[301][301];
  7. int minv[301][301][9][9];
  8. int mm[306];
  9. int n,m;
  10. void initrmq()
  11. {
  12. int i,j;
  13. for(i=1;i<=n;i++)
  14. {
  15. for(j=1;j<=n;j++)
  16. {
  17. minv[i][j][0][0]=map[i][j];
  18. }
  19. }
  20. int ii,jj;
  21. for(ii=0;ii<=mm[n];ii++)
  22. for(jj=0;jj<=mm[n];jj++)
  23. {
  24. if(ii+jj)
  25. {
  26. for(i=1;i+(1<<ii)-1<=n;i++)
  27. for(j=1;j+(1<<jj)-1<=n;j++)
  28. {
  29. if(ii)
  30. minv[i][j][ii][jj]=min(minv[i][j][ii-1][jj],minv[i+(1<<(ii-1))][j][ii-1][jj]);
  31. else
  32. minv[i][j][ii][jj]=min(minv[i][j][ii][jj-1],minv[i][j+(1<<(jj-1))][ii][jj-1]);
  33. }
  34. }
  35. }
  36. }
  37. int q_min(int x1,int y1,int x2,int y2)
  38. {
  39. int k1=mm[x2-x1+1];
  40. int k2=mm[y2-y1+1];
  41. x2=x2-(1<<k1)+1;
  42. y2=y2-(1<<k2)+1;
  43. return min(min(minv[x1][y1][k1][k2],minv[x1][y2][k1][k2]),min(minv[x2][y1][k1][k2],minv[x2][y2][k1][k2]));
  44. }
  45. void init()
  46. {
  47. mm[0]=-1;
  48. int i;
  49. for(i = 1;i <= 305;i++)
  50. mm[i] = ((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
  51.  
  52. }
  53. int main()
  54. {
  55. int t;
  56. init();
  57. scanf("%d",&t);
  58. while(t--)
  59. {
  60. //int n,m;
  61. scanf("%d",&n);
  62. int i,j;
  63. for(i=1;i<=n;i++)
  64. {
  65. for(j=1;j<=n;j++)
  66. scanf("%d",&map[i][j]);
  67. }
  68. initrmq();
  69. scanf("%d",&m);
  70. while(m--)
  71. {
  72. int r1,c1,r2,c2;
  73. scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
  74. printf("%d\n",q_min(r1,c1,r2,c2));
  75. }
  76. }
  77. }

ZOJ 题目2859 Matrix Searching(二维RMQ)的更多相关文章

  1. 牛客 - 700I - Matrix Again - 二维RMQ - 二分

    https://ac.nowcoder.com/acm/contest/700/I 二维RMQ,贴个板子,注意爆内存,用char就可以了,char也可以存负数. 然后二分枚举对角线长度,理由很简单. ...

  2. ZOJ 1859 Matrix Searching(二维线段树)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1859 Matrix Searching Time Limit: 10 Seco ...

  3. zoj 2589 Matrix Searching 二维线段树

    题目链接 给一个n*n的矩阵, 给q个查询, 每次给出x1, y1, x2, y2, 求这个矩阵中的最小值. 代码基本上和上一题相同... #include<bits/stdc++.h> ...

  4. hdu 2888 二维RMQ

    Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. hdu2888 二维RMQ

    Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  6. hdu 2888 二维RMQ模板题

    Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. HDU 2888 Check Corners (模板题)【二维RMQ】

    <题目链接> <转载于 >>> > 题目大意: 给出一个N*M的矩阵,并且给出该矩阵上每个点对应的值,再进行Q次询问,每次询问给出代询问子矩阵的左上顶点和右下 ...

  8. POJ 2019 Cornfields [二维RMQ]

    题目传送门 Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7963   Accepted: 3822 ...

  9. 【HDOJ 2888】Check Corners(裸二维RMQ)

    Problem Description Paul draw a big m*n matrix A last month, whose entries Ai,j are all integer numb ...

随机推荐

  1. java 装饰者类

    装饰者模式:增强一个类的功能还可以让装饰者类之间互相装饰. 装饰者模式和继承的区别: 继承实现的增强类: 优点:代码结构清晰,而且实现简单 缺点:对于每一个的需要增强的类都要创建具体的子类来帮助其增强 ...

  2. JS获取到时间转换成字符串类型

    JS获取到时间格式为:/Date(1479279579047)/ 提供一个函数可将其转换为“yyyy-MM-dd”和“yyyy-MM-dd hh:mm:ss” //时间日期转换成string func ...

  3. FCC 基础JavaScript 练习1

    1.JavaScript中的注释方式有以下两种 // This is an in-line comment. /* This is a multi-line comment */ 2.avaScrip ...

  4. Java&Xml教程(八)使用JDOM将Java对象转换为XML

    在前面的教程中我们学习了如何使用JDOM解析和修改XML文件内容,本节介绍如何将Java对象转换为XML数据并生成文件. JDOM的Document类提供了便捷的方法创建元素和属性,XMLOutput ...

  5. 通过机智云APP来学习安卓

    效果非常之好,安卓6.0之后就进行了动态授权.按照网上的视频一步一步调试的非常成功,非常舒服.

  6. NodeJS、NPM安装配置步骤

    安装NodeJS和NPM 1.Node JS 官网下载地址 https://nodejs.org/en/download/ 2.安装完后,使用cmd 命令输入两个命令,查看安装状态 node -v n ...

  7. day17-常用模块II (hashlib、logging)

    目录 hashlib模块 撞库破解hash算法加密 logging模块 配置日志文件 hashlib模块 一般用于明文加密,其实就是一个自定义的字符编码表.原来0和1转换成字符,而现在的是字符转成另一 ...

  8. jmeter的webservice接口测试(SOAP/XML-RPC Request)

    摘自:https://www.cnblogs.com/imyalost/p/5804359.html 项目背景:公司的微信端H5界面新开发了会员注册功能,需要对其进行压力测试 项目目标:需要承受每分钟 ...

  9. vue组件---动态组件&异步组件

    (1)在动态组件上使用keep-alive 之前曾经在一个多标签的界面中使用 is 特性来切换不同的组件.接下来简单回顾下 <component>元素是vue 里面的一个内置组件.在里面使 ...

  10. 17Oracle Database 维护

    Oracle Database 维护 备份 还原