题目链接:

  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. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  2. spring中Bean创建

    Spring中bean的加载过程: 1.获取配置文件资源 2.对获取的xml资源进行一定的处理检验 3.处理包装资源 4.解析处理包装过后的资源 5.加载提取bean并注册(添加到beanDefini ...

  3. 【配置关系】—Entity Framework实例详解

    实体间的关系,简单来说无非就是一对一.一对多.多对多,根据方向性来说又分为双向和单向.Code First在实体关系上有以下约定: 1. 两个实体,如果一个实体包含一个引用属性,另一个实体包含一个集合 ...

  4. activemq的安装使用

    近期有项目中用到消息队列,JMS规范中实现最好的开源框架就是activemq.所以选择它(当然这是我老大决定的,像我这样的刚入职场的小菜鸟考虑问题还不太全面)作为消息队列数据传输.公司有有成型的消息队 ...

  5. 【bzoj3210】花神的浇花集会

    将(x,y)转化成(x+y,x-y)可以将切比雪夫距离转化成曼哈顿距离(自己推一推) A.B的切比雪夫距离就是A‘.B‘曼哈顿距离的一半. 那么可以将x.y分离处理,排序中位数即可. 注意如果最后选的 ...

  6. Ghost wenjian目录

    SOAMANAGER打不开网页,需要配置ghost 文件, C:\Windows\System32\drivers\etc   

  7. Codeforces Round #346 (Div. 2) E. New Reform

    E. New Reform time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. git apply、git am打补丁.diff 和 .patch【转】

    本文转载自:https://www.jianshu.com/p/e5d801b936b6 前提: 生成patch: git format-patch -M master 生成指定patch,0163b ...

  9. UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)

    d.给定一个图,判断是不是二分图. s.可以交叉染色,就是二分图:否则,不是. 另外,此题中的图是强连通图,即任意两点可达,从而dfs方法从一个点出发就能遍历整个图了. 如果不能保证从一个点出发可以遍 ...

  10. hdu 3336 Count the string(next数组)

    题意:统计前缀在串中出现的次数 思路:next数组,递推 #include<iostream> #include<stdio.h> #include<string.h&g ...