int main(){
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++) {
scanf("%d", &val[i][j]);
dp[i][j][][] = val[i][j];
} for (int i = ; ( << i) <= n; i++) {
for (int j = ; ( << j) <= m; j++) {
if (i == && j == ) continue;
for (int row = ; row + ( << i) - <= n; row++)
for (int col = ; col + ( << j) - <= m; col++) {
//当x或y等于0的时候,就相当于一维的RMQ了
//if(i == 0) dp[row][col][i][j] = max(dp[row][col][i][j - 1], dp[row][col + (1 << (j - 1))][i][j - 1]);
if (j == ) dp[row][col][i][j] = max(dp[row][col][i - ][j], dp[row + ( << (i - ))][col][i - ][j]);
else dp[row][col][i][j] = max(dp[row][col][i][j - ], dp[row][col + ( << (j - ))][i][j - ]);
}
}
}
}

因为i == 0时的代码和 i != 0 && j != 0时的一样 所以就合并了

i  !=0 && j != 0时

查询:

询问的话,也要稍加改变,一维RMQ返回的是一段区间的最值,而二维的RMQ需要返回的一个矩阵的最值,所以返回的时候要注意,所返回的一定要构成一个矩阵

按照一维RMQ的思路来做的话,二维的就要返回四个值的最值了(假设询问的是(x1, y1), (x2, y2)这个矩阵内的最值) 
那么应该返回的是 
m1 = dp[x1][y1][k1][k2] 
m2 = dp[x2 - (1 << k1 ) + 1][y1][k1][k2] 
m3 = dp[x1][y2 - (1 << k2) + 1][k1][k2] 
m4 = dp[x2 - (1 << k1) + 1][y2 - (1 << k2) + 1][k1][k2] 
这四个值再去最值即可

//本来一维RMQ询问的时候是一个区间,现在变成了一个矩形,所以需要四个角度
int rmq(int x1, int y1, int x2, int y2) {
int kx = , ky = ;
while (( << ( + kx)) <= x2 - x1 + 1) kx++;
while (( << ( + ky)) <= y2 - y1 + 1) ky++;
int m1 = dp[x1][y1][kx][ky];
int m2 = dp[x2 - ( << kx) + ][y1][kx][ky];
int m3 = dp[x1][y2 - ( << ky) + ][kx][ky];
int m4 = dp[x2 - ( << kx) + ][y2 - ( << ky) + ][kx][ky]; return max(max(m1, m2), max(m3, m4));
}

大约就是这样。。。手残 见谅。。

以上模板是求最大值  求最小值 该max为min即可

二维RMQ模板的更多相关文章

  1. hdu 2888 二维RMQ模板题

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

  2. poj2019 二维RMQ模板题

    和hdu2888基本上一样的,也是求一个矩阵内的极值 #include<iostream> #include<cstring> #include<cstdio> # ...

  3. POJ 2019 Cornfields [二维RMQ]

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

  4. HDU 2888:Check Corners(二维RMQ)

    http://acm.hdu.edu.cn/showproblem.php?pid=2888 题意:给出一个n*m的矩阵,还有q个询问,对于每个询问有一对(x1,y1)和(x2,y2),求这个子矩阵中 ...

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

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

  6. hduacm 2888 ----二维rmq

    http://acm.hdu.edu.cn/showproblem.php?pid=2888 模板题  直接用二维rmq 读入数据时比较坑爹  cin 会超时 #include <cstdio& ...

  7. hdu2888 二维RMQ

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

  8. thinkphp二维数组模板输出方法

    thinkphp二维数组模板输出方法 先写个记录,有空再整理发上来

  9. HDU2888 Check Corners(二维RMQ)

    有一个矩阵,每次查询一个子矩阵,判断这个子矩阵的最大值是不是在这个子矩阵的四个角上 裸的二维RMQ #pragma comment(linker, "/STACK:1677721600&qu ...

随机推荐

  1. 记录使用jQuery和Python抓取采集数据的一个实例

    从现成的网站上抓取汽车品牌,型号,车系的数据库记录. 先看成果,大概4w条车款记录 一共建了四张表,分别存储品牌,车系,车型和车款 大概过程: 使用jQuery获取页面中呈现的大批内容 能通过页面一次 ...

  2. 【mysql优化】mysql count(*)、count(1)、count(主键字段)、count(非主键字段)哪个性能最佳

    测试结果为:count(*)和count(1)基本相等,count(非主键字段)最耗性能 -- 数据量 708254select count(*) from tmp_test1;-- avg 0.22 ...

  3. python开发ftp服务器第一天(pyftpdlib)

    学习了大约快一个月的python,现在开始有意识做一些项目.(我的新书<Python爬虫开发与项目实战>出版了,大家可以看一下样章) 据我了解,python现在更多的是用于自动化运维方面, ...

  4. 一次性搞定Session

    相信很多人遇到过同一个浏览器会出现Session覆盖问题.今天主要针对Session覆盖问题来看看Session是如何工作的.那么先看一张简单的图说明一下 上面的图大致的说明Session工作简单创建 ...

  5. mysql数据库 root密码重置

    问题 忘记了MySQL的密码,网上搜索的杂七杂八,汇总一下. mysql版本是windows的mysql 5.7 步骤 1.以管理员身份打开cmd,切换到MySQL的bin目录 默认的话,一般是在C: ...

  6. Python不生成HTMLTestRunner报告-转载学习

    1.问题:Python中同一个.py文件中同时用unittest框架和HtmlReport框架后,HtmlReport不被执行. 2.为什么?其实不是HtmlReport不被执行,也不是HtmlRep ...

  7. windows下Mongodb图形化工具安装及配置

    接上篇文章<Windows下Mongodb安装部署.docx> 一.RockMongo 1.RockMongo需要php环境,首先需要搭建php环境,选择采用 下载xampp,这里我用的是 ...

  8. 牛客网暑期ACM多校训练营(第一场):E-Removal(DP)

    链接:E-Removal 题意:给出序列 s1, s2, ..., sn ,1<=s[i]<=10.问删除m个数后,有多少种不同的序列. 题解:定义dp[i][j]代表长度为i,最末尾的数 ...

  9. Python爬虫:爬取美拍小姐姐视频

    最近在写一个应用,需要收集微博上一些热门的视频,像这些小视频一般都来自秒拍,微拍,美拍和新浪视频,而且没有下载的选项,所以只能动脑想想办法了. 第一步 分析网页源码. 例如:http://video. ...

  10. LearnPython - Zip格式文件的解压缩

    import zipfile import os def unzip(zip_name, target_dir): files = zipfile.ZipFile(zip_name) for zip_ ...