HDU-2888 Check Corners 二维RMQ
题目链接: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的更多相关文章
- Hdu 2888 Check Corners (二维RMQ (ST))
题目链接: Hdu 2888 Check Corners 题目描述: 给出一个n*m的矩阵,问以(r1,c1)为左上角,(r2,c2)为右下角的子矩阵中最大的元素值是否为子矩阵的顶点? 解题思路: 二 ...
- 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& ...
随机推荐
- BZOJ 2752 高速公路(road)(线段树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2752 题意:给出一个数列A,维护两种操作: (1)将区间[L,R]之内的所有数字增加de ...
- java获取系统指定时间年月日
java获取系统指定时间年月日 private String setDateTime(String falg) { Calendar c = Calendar.getInstance(); c.set ...
- ural1238. Folding(记忆化)
1238 这算模拟加记忆化吗 找bug找了2个多小时..记忆化部分好想 就是字符串处理部分挫了 一个个复制模拟 各种修改查找 #include <iostream> #include< ...
- 【笨嘴拙舌WINDOWS】GDI绘制区域
在默认情况下,Gdi绘画操作的使用白纸(窗口的客户区)黑字(Pen的颜色)!前面我们已经讲过如何改笔,现在来学习改变白纸(GDI的绘制区域) 正常的纸为一个矩形形状!有时候小孩不小心撕掉纸的一角,不小 ...
- GUI for git|SourceTree|入门基础
原文链接:http://www.jianshu.com/p/be9f0484af9d 目录 SourceTree简介 SourceTree基本使用 SourceTree&Git部分名词解释 相 ...
- android EditText控件可输入正负数及小数位
设置android:inputType="numberSigned|numberDecimal" <EditText android:id="@+id/editTe ...
- DOMContentLoaded事件
今天查看百度空间源代码,发现多了个util.js文件,打开看看.里面里面定义了addDOMLoadEvent.这是干什么用的? 仔细查看代码,发现在Mozilla添加了DOMContentLoaded ...
- Private Bytes,Working Set,Virtual Size的区别
http://aigo.iteye.com/blog/1930209 http://stackoverflow.com/questions/1984186/what-is-private-bytes- ...
- 多种css3时尚侧栏菜单展开显示效果Off-Canvas Menu Effects
今天我们想分享多种css3时尚侧栏菜单展开显示效果.侧边栏应用广泛,我们之前已经产生了一些效果灵感.风格演变,今天我们要展示一套新的灵感的现代效果.不同的布局和菜单的同步转换和页面可以让一切看起来更有 ...
- php 页面参数过多时自动拼接get参数的函数
function getUri($query){ $request_uri = $_SERVER["REQUEST_URI"]; $url = strstr($request_ur ...