HDU-2888 Check Corners 二维RMQ

时间:2022-09-18 22:01:15

  题目链接: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 &lpar;二维RMQ &lpar;ST&rpar;&rpar;

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

  2. HDU 2888 Check Corners &lpar;模板题&rpar;【二维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设计模式

    五种创建型模式: 1.工厂模式 普通工厂模式: 工厂类提供一个方法可以生产多种实现了某种接口的类 多方法工厂模式: 一个方法对应一个要生产的类 静态工厂模式: 静态方法来生产类 2.抽象工厂模式 工厂 ...

  2. bug提交模板

    简述所属版本所属模块严重等级优先级分配给[网络情况][前置条件][详情描述] 1. 2. 3.[预期结果][实际结果][历史版本][备注][是否补充用例] 另外: 1.若和界面有关的bug尽量提供对应 ...

  3. HDU 1203 I NEED A OFFER&excl;(dp)

    Problem Description Speakless很长时间,我想出国.现在,他已经完成了所有需要的检查.准备好所有要准备的材料,于是,便须要去申请学校了.要申请国外的不论什么大学.你都要交纳一 ...

  4. linux下设置phantomjs环境变量

    1)vim /etc/profile2)在文件的最后一行,添加安装路径path语句:(注意路径是phantomjs的安装路径)export PATH=${PATH}:/usr/local/src/ph ...

  5. sql的基本语法

    一. 数据库 1.查询服务器上有哪些数据库 show databases; 2.新建数据库 create database TestSqlSugar; 3.进入数据库 use TestSqlSugar ...

  6. jvm原理之内存机制

    转自:https://www.cnblogs.com/dreamowneryong/p/6381633.html JVM栈由堆.方法区,栈.本地方法栈.程序计数器等部分组成,结构图如下所示: 还有一张 ...

  7. Linux之virtualbox中的ubuntu虚拟机linux系统共享文件夹

    windows通过virtualbox软件与linux系统机型文件共享 1.第一步 在设置中找到共享文件夹选项,选择添加共享文件夹 2.第二步 选择需要与linux进行共享的文件夹,并选择固定分配 3 ...

  8. jstack 分析程序性能

    摘录自:https://www.jianshu.com/p/6690f7e92f27 简要说明下步骤: 1:通过top命令,cpu,占用率较高的进程 2:通过 top -Hp PID 查看该进程中线程 ...

  9. kong nginx 配置文件说明&amp&semi;&amp&semi;借鉴

    备注:     只是简单的进行说明配置文件,不会牵扯到源码   1.  配置文件位置 // 通过ps 查找 ps -ef |grep nginx /usr/local/openresty/nginx/ ...

  10. Matlab 之 FFT的理解和应用

    网上看了一些大牛的关于FFT的见解,加上自己的一点儿理解,针对以下这几个问题来加深对FFT的理解. 不知道大家有没有类似以下几点的困惑: 问题的提出 对于1秒钟输出的连续信号,使用采样率Fs不同,就会 ...