Hdu 2888 Check Corners (二维RMQ (ST))
题目链接:
题目描述:
给出一个n*m的矩阵,问以(r1,c1)为左上角,(r2,c2)为右下角的子矩阵中最大的元素值是否为子矩阵的顶点?
解题思路:
二维区间最值查询,可以用二维的ST算法,dp[x][y][i][j]表示x轴上[x,x+(1<<i)-1]与y轴上[y-(1<<j)+1,y]组成的子矩阵中的最值。预处理的时候处理出来子矩阵的最值,查询的时候对于x,y轴上的查询区间[m, n],都要找到一个k,k满足 n-m+1 < 2^(k+1),假设x轴上为k1,y轴上为k2,然后把x轴上[r1,r2]分为[r1, r1+(1<<k1)-1]与[r2-(1<<k1)+1, r2],y轴类似。根据对x,y轴的划分把查询子矩阵分成4部分,然后选取4部分中的最值即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = ;
int dmax[maxn][maxn][][];
int arr[maxn][maxn], LOG[maxn]; void init_RMQ (int n, int m)
{
LOG[] = -;
for (int i=; i<maxn; i++)
LOG[i] = i&(i-)?LOG[i-]:LOG[i-]+; for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
dmax[i][j][][] = arr[i][j]; for (int i=; i<=LOG[n]; i++)
for (int j=; j<=LOG[m]; j++)
{
if (i== && j==) continue; for (int row=; row+(<<i)-<=n; row++)
for (int col=; col+(<<j)-<=m; col++)
if (i == )
dmax[row][col][i][j] = max (dmax[row][col][i][j-], dmax[row][col+(<<(j-))][i][j-]);
else
dmax[row][col][i][j] = max (dmax[row][col][i-][j], dmax[row+(<<(i-))][col][i-][j]);
}
}
int ST (int x1, int y1, int x2, int y2)
{//(x1,y1)为左上角,(x2,y2)为右下角
int k1 = LOG [x2 - x1 + ];
int k2 = LOG [y2 - y1 + ];
int mm1 = dmax [x1][y1][k1][k2];
int mm2 = dmax [x1][y2-(<<k2)+][k1][k2];
int mm3 = dmax [x2-(<<k1)+][y1][k1][k2];
int mm4 = dmax [x2-(<<k1)+][y2-(<<k2)+][k1][k2];
return max (max (mm1, mm2), max (mm3, mm4));
} int main ()
{
int n, m;
while (scanf ("%d %d", &n, &m) != EOF)
{
for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
scanf ("%d", &arr[i][j]); init_RMQ(n, m); int x1, y1, x2, y2, q, ans;
scanf ("%d", &q);
while (q --)
{
scanf ("%d %d %d %d", &x1, &y1, &x2, &y2);
ans = ST (x1, y1, x2, y2);
printf ("%d ", ans); if (arr[x1][y1]==ans||arr[x1][y2]==ans||arr[x2][y1]==ans||arr[x2][y2]==ans)
printf ("yes\n");
else
printf ("no\n"); }
}
return ;
}
Hdu 2888 Check Corners (二维RMQ (ST))的更多相关文章
- HDU-2888 Check Corners 二维RMQ
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2888 模板题.解题思路如下(转载别人写的): dp[row][col][i][j] 表示[row,ro ...
- HDU 2888 Check Corners (模板题)【二维RMQ】
<题目链接> <转载于 >>> > 题目大意: 给出一个N*M的矩阵,并且给出该矩阵上每个点对应的值,再进行Q次询问,每次询问给出代询问子矩阵的左上顶点和右下 ...
- HDU 2888:Check Corners(二维RMQ)
http://acm.hdu.edu.cn/showproblem.php?pid=2888 题意:给出一个n*m的矩阵,还有q个询问,对于每个询问有一对(x1,y1)和(x2,y2),求这个子矩阵中 ...
- 【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 ...
- hdu 2888 二维RMQ模板题
Check Corners Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 2888 二维RMQ
Check Corners Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU2888 Check Corners(二维RMQ)
有一个矩阵,每次查询一个子矩阵,判断这个子矩阵的最大值是不是在这个子矩阵的四个角上 裸的二维RMQ #pragma comment(linker, "/STACK:1677721600&qu ...
- 二维RMQ hdu 2888
题目:点这里 题意:给出一个n*m的矩阵,然后又Q个询问:每个询问有x1,y1,x2,y2,x1,y1为子矩阵的左上角坐标,x2,y2为右上角的坐标.求此子矩阵中元素最大值,判断最大值是否在子矩阵四个 ...
- hduacm 2888 ----二维rmq
http://acm.hdu.edu.cn/showproblem.php?pid=2888 模板题 直接用二维rmq 读入数据时比较坑爹 cin 会超时 #include <cstdio& ...
随机推荐
- JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- feed流,图片在左还是右的区别是
feed流设计:那些谋杀你时间APP | 人人都是产品经理 http://www.woshipm.com/pd/773523.html
- object equal
package equals; public class EqualsTest { public static void main(String[] args) { Employee alice1 = ...
- 传统maven项目创建
转自:https://blog.csdn.net/wangfengtong/article/details/77098238 需求表均同springmvc案例 此处只是使用maven 注意,以下所有需 ...
- 关于eclipse的resource文件没有发布到tomcat上的解决方案
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/luman1991/article/details/53457302
- codeforces 450C. Jzzhu and Chocolate 解题报告(449A)
题目链接:http://codeforces.com/contest/450/problem/C 题目意思:给出一个 n * m 大小的chocolate bar,你需要在这个bar上切 k 刀,使得 ...
- html5--6-57 阶段练习6-折叠导航栏
html5--6-57 阶段练习6-折叠导航栏 实例 @charset="UTF-8"; *{ ; ; } h3+div{ ; overflow: hidden; transiti ...
- 一步一步学Silverlight 2系列(7):全屏模式支持
一步一步学Silverlight 2系列(7):全屏模式支持 概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言V ...
- java中io类型及成熟io框架
就io本身而言,概念上有5中模型:blocking I/O, nonblocking I/O, I/O multiplexing(select and poll), singal driven I/O ...
- struts2通用标签
Struts2框架为我们提供了很多标签,这些标签总体上可以分为两类:通用标签和UI标签.通用标签分为两类:数据标签和控制标签.数据标签用于访问值栈中数据,控制标签用于控制呈现页面时数据执行流程.使用S ...