题目链接:

  Hdu 2888 Check Corners

题目描述:

  给出一个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))的更多相关文章

  1. HDU-2888 Check Corners 二维RMQ

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2888 模板题.解题思路如下(转载别人写的): dp[row][col][i][j] 表示[row,ro ...

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

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

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

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

  4. 【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 ...

  5. hdu 2888 二维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)To ...

  7. HDU2888 Check Corners(二维RMQ)

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

  8. 二维RMQ hdu 2888

    题目:点这里 题意:给出一个n*m的矩阵,然后又Q个询问:每个询问有x1,y1,x2,y2,x1,y1为子矩阵的左上角坐标,x2,y2为右上角的坐标.求此子矩阵中元素最大值,判断最大值是否在子矩阵四个 ...

  9. hduacm 2888 ----二维rmq

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

随机推荐

  1. Alert提示框之后跳转指定页面

    <li onclick="closes();">BTC</li> alert跳转到指定页面 <script type="text/javas ...

  2. HDU 6058 Kanade's sum 二分,链表

    Kanade's sum Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th larg ...

  3. SimpleHTTPServer

    SimpleHTTPServer python -m SimpleHTTPServer 8989

  4. ajax访问json文件缓存问题

    ajax访问json文件,json文件改动,访问的时候也不能及时看到改动后的内容. 这是因为浏览器缓存的原因. 在这时候就需要清除浏览器的缓存或者加上一个标记,让ajax访问文件的时候知道这是一个新的 ...

  5. tuple built-in function

    tuple tips: 1.对于Python中的tuple类型来说,他与其它的序列类型来讲最大的不同就是tuple是不可变的. 2.当你需要创建一个只有一个元素的tuple时,需要在元祖分隔符里面加一 ...

  6. os、sys和shutil模块

    运行环境:python3 OS模块:os 模块提供了一个统一的操作系统的接口函数 下面的path指路径的意思 os.stat(file) #查询文件属性操作 os.sep #取代操作系统特定的路径分隔 ...

  7. 中文用户名的js检验正则

    原文:http://www.jb51.net/article/20719.htm 好多网站需要用中文用户名注册,下面的代码就是客户端检测.强烈建议后台也要控制一下. username1: " ...

  8. 预处理指令#pragram

    #pragma介绍 #pragma是一个预处理指令,pragma的中文意思是『编译指示』.它不是Objective-C中独有的东西(貌似在C/C++中使用比较多),最开始的设计初衷是为了保证代码在不同 ...

  9. Watir: Win32ole对于excel某些指令无法操作的时候有如下解决方案

    Similar Threads 1. WIN32OLE - failed to create WIN32OLE 2. WIN32OLE#[] and WIN32OLE#[]= method in Ru ...

  10. [shell test] multiple conditions

      Classic technique (escape metacharacters): if[ \( $g -eq 1-a "$c"="123" \) -o ...