题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2888

  模板题。解题思路如下(转载别人写的):

dp[row][col][i][j] 表示[row,row+2^i-1]x[col,col+2^j-1] 二维区间内的最小值
这是RMQ-ST算法的核心: 倍增思想
== min( [row,row+ 2^(i-1)-1]x[col,col+2^j-1], [row+2^(i-1),row+2^i-1]x[col,col+2^j-1] )
= min(dp[row][col][i-1][j], dp[row+(1<<(i-1))][col][i-1][j] )
//y轴不变,x轴二分 (i!=0)

== min( [row,row+2^i-1]x[col,col+2^(j-1)-1],  [row,row+2^i-1]x[col+2^(i-1),col+2^j-1] )
= min(dp[row][col][i][j-1], dp[row][col+(1<<(j-1))][i][j-1] ) 
//x轴不变,y轴二分 (j!=0)
即:
dp[row][col][i][j] = min(dp[row][col][i-1][j], dp[row + (1<<(i-1))][col][i-1][j] )   
             或    = min(dp[row][col][i][j-1], dp[row][col+(1<<(j-1))][i][j-1] )
查询[x1,x2]x[y1,y2]
令 kx = (int)log2(x2-x1+1);
   ky = (int)log2(y2-y1+1);
查询结果为
   m1 = dp[x1][y1][kx][ky]                    = dp[x1][y1][kx][ky];
   m2 = dp[x2-2^kx+1][y1][kx]ky]              = dp[x2-(1<<kx)+1][y1][kx][ky];
   m3 = dp[x1][y2-2^ky+1][kx][ky]             = dp[x1][y2-(1<<ky)+1][kx][ky];
   m4 = dp[x2-2^kx+1][y2-2^ky+1][kx][ky]      = dp[x2-(1<<kx)+1][y2-(1<<ky)+1][kx][ky];

结果 = min(m1,m2,m3,m4)

 //STATUS:C++_AC_4109MS_30160KB
#include <functional>
#include <algorithm>
#include <iostream>
//#include <ext/rope>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,102400000")
//using namespace __gnu_cxx;
//define
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1.0)
//typedef
typedef long long LL;
typedef unsigned long long ULL;
//const
const int N=;
const int INF=0x3f3f3f3f;
const int MOD=1e+,STA=;
const LL LNF=1LL<<;
const double EPS=1e-;
const double OO=1e15;
const int dx[]={-,,,};
const int dy[]={,,,-};
const int day[]={,,,,,,,,,,,,};
//Daily Use ...
inline int sign(double x){return (x>EPS)-(x<-EPS);}
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
//End
int val[N][N],dp[N][N][][];
int n,m,Q;
void init()
{
for(int row = ; row <= n; row++)
for(int col = ; col <=m; col++)
dp[row][col][][] = val[row][col];
int mx = log(double(n)) / log(2.0);
int my = log(double(m)) / log(2.0);
for(int i=; i<= mx; i++)
{
for(int j = ; j<=my; j++)
{
if(i == && j ==) continue;
for(int row = ; row+(<<i)- <= n; row++)
{
for(int col = ; col+(<<j)- <= m; col++)
{
if(i == )//y轴二分
dp[row][col][i][j]=max(dp[row][col][i][j-],dp[row][col+(<<(j-))][i][j-]);
else//x轴二分
dp[row][col][i][j]=max(dp[row][col][i-][j],dp[row+(<<(i-))][col][i-][j]);
}
}
}
}
}
int RMQ2D(int x1,int y1,int x2,int y2)
{
int kx = log(double(x2-x1+)) / log(2.0);
int ky = log(double(y2-y1+)) / log(2.0);
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));
}
//END
int main()
{
// freopen("in.txt","r",stdin);
int i,j,ans;
int x1,y1,x2,y2;
while(~scanf("%d%d",&n,&m))
{
for(i=;i<=n;i++)
for(j=;j<=m;j++)
scanf("%d",&val[i][j]);
init();
scanf("%d",&Q);
while(Q--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
ans=RMQ2D(x1,y1,x2,y2);
if(ans==val[x1][y1] || ans==val[x2][y2]
|| ans==val[x1][y2] || ans==val[x2][y1]){
printf("%d yes\n",ans);
}
else printf("%d no\n",ans);
}
}
return ;
}

HDU-2888 Check Corners 二维RMQ的更多相关文章

  1. Hdu 2888 Check Corners (二维RMQ (ST))

    题目链接: Hdu 2888 Check Corners 题目描述: 给出一个n*m的矩阵,问以(r1,c1)为左上角,(r2,c2)为右下角的子矩阵中最大的元素值是否为子矩阵的顶点? 解题思路: 二 ...

  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. 32-语言入门-32-Triangular Sums

    题目地址: http://acm.nyist.net/JudgeOnline/problem.php?pid=122    描述The nth Triangular number, T(n) = 1 ...

  2. Create Entity Data Model

    http://www.entityframeworktutorial.net/EntityFramework5/create-dbcontext-in-entity-framework5.aspx 官 ...

  3. lumen 使用 redis缓存

    建议修改composer.json require 节点如下: "require": { "php": ">=5.5.9", &quo ...

  4. 浅谈Websocket、Ajax轮询和长连接(long pull)

    最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket Websocket是HTML5中提出的新的协议,注意,这里是协议,可以 ...

  5. 什么是HotSpot VM & 深入理解Java虚拟机

    参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> ...

  6. string.Format 格式化时间,货币

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  7. js方式进行地理位置的定位api搜集

    新浪 //int.dpool.sina.com.cn/iplookup/iplookup.php?format=js //int.dpool.sina.com.cn/iplookup/iplookup ...

  8. XML中对特殊字符的处置

    str = str.replaceAll("‘", "‘"); str = str.replaceAll("’", "‘" ...

  9. UVa 11137 (完全背包方案数) Ingenuous Cubrency

    题意:用13.23……k3这些数加起来组成n,输出总方案数 d(i, j)表示前i个数构成j的方案数则有 d(i, j) = d(i-1, j) + d(i, j - i3) 可以像01背包那样用滚动 ...

  10. A1486. 树(王康宁)

    题目:http://www.tsinsen.com/A1486 题解: 其实看到和路径有关的就应该想到点分治. 我们找出重心之后遍历每一棵子树得到它的 { x=经过特殊点的个数,y=到rt的异或和} ...