#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map> #define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8 using namespace std;
/*
二维RMQ模板题
同一维一样 用dp[row][col][i][j]表示(row,col)到(row+2^i,col+2^j)矩形内的最小值
查询
*/ int mapp[][];
int dpmax[][][][];
int dpmin[][][][];
int flag;
void RMQ_init2d(int m, int n)
{
for (int i = ; i <= m; i++)
{
for (int j = ; j <= n; j++)
{
dp[i][j][][] = dpmax[i][j][][] = mapp[i][j];
}
}
int t = log((double)n) / log(2.0); for (int i = ; i <= t; i++)
{
for (int j = ; j <= t; j++)
{
if (i == && j == )
{
continue;
}
for (int row = ; row + ( << i) - <= m; row++)
{
for (int col = ; col + ( << j) - <= n; col++)
{
if (i)
{
dpmax[row][col][i][j] = max(dpmax[row][col][i - ][j], dpmax[row + ( << (i - ))][col][i - ][j]);
dpmin[row][col][i][j] = min(dpmin[row][col][i - ][j], dpmin[row + ( << (i - ))][col][i - ][j]);
}
else
{
dpmax[row][col][i][j] = max(dpmin[row][col][i][j - ], dpmin[row][col + ( << (j - ))][i][j - ]);
dpmin[row][col][i][j] = min(dpmin[row][col][i][j - ], dpmin[row][col + ( << (j - ))][i][j - ]);
}
}
}
}
}
}
int RMQ_2dmax(int x1, int y1, int x2, int y2)
{
int k1 = log(double(x2 - x1 + )) / log(2.0);
int k2 = log(double(y2 - y1 + )) / log(2.0);
int m1 = dpmax[x1][y1][k1][k2];
int m2 = dpmax[x2 - ( << k1) + ][y1][k1][k2];
int m3 = dpmax[x1][y2 - ( << k2) + ][k1][k2];
int m4 = dpmax[x2 - ( << k1) + ][y2 - ( << k2) + ][k1][k2];
int _max = max(max(m1, m2), max(m3, m4));
return _max;
}
int RMQ_2dmin(int x1, int y1, int x2, int y2)
{
int k1 = log(double(x2 - x1 + )) / log(2.0);
int k2 = log(double(y2 - y1 + )) / log(2.0);
int m1 = dpmin[x1][y1][k1][k2];
int m2 = dpmin[x2 - ( << k1) + ][y1][k1][k2];
int m3 = dpmin[x1][y2 - ( << k2) + ][k1][k2];
int m4 = dpmin[x2 - ( << k1) + ][y2 - ( << k2) + ][k1][k2];
int _min = min(min(m1, m2), min(m3, m4));
return _min;
}
int main()
{
int n, m, t;
int x1, x2, y1, y2;
while (~scanf("%d%d", &m, &n))
{
for (int i = ; i <= m; i++)
{
for (int j = ; j <= n; j++)
{
scanf("%d", &mapp[i][j]);
}
}
RMQ_init2d(m, n);
scanf("%d", &t);
while (t--)
{
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
flag = ;
int _max = RMQ_2dmax(x1, y1, x2, y2);
printf("max:%d", _max);
int _min = RMQ_2dmin(x1, y1, x2, y2);
printf("min:%d\n", _min);
}
}
return ;
}

RMQ 2d 模板的更多相关文章

  1. poj 3264 Balanced Lineup (RMQ算法 模板题)

    RMQ支持操作: Query(L, R):  计算Min{a[L],a[L+1], a[R]}. 预处理时间是O(nlogn), 查询只需 O(1). RMQ问题 用于求给定区间内的最大值/最小值问题 ...

  2. RMQ(模板 ST 区间最值,频繁的间隔时间)

    PS: 介绍:http://blog.csdn.net/liang5630/article/details/7917702 RMQ算法.是一个高速求区间最值的离线算法,预处理时间复杂度O(n*log( ...

  3. ZOJ 2859 二维RMQ(模板)

    这题求范围最小值,RMQ正好是用来解决这方面的.所以再适合只是了,又是离线静态输入输出的,所以时间比二维线段树快. #include<iostream> #include<cstdi ...

  4. rmq问题模板处理

    rmq问题: 先贴一下定义 范围最值查询 维基百科,自由的百科全书 范围最值查询(Range Minimum Query),是针对数据集的一种条件查询.若给定一个数组 A[1, n],范围最值查询指定 ...

  5. RMQ算法模板

    分别写了下标从0和1开始的两种 #include<stdio.h> #include<string.h> #include<algorithm> #include& ...

  6. 倍增算法总结 ( 含RMQ模板)

    部分题目来自<算法竞赛设计进阶> 问题       给定一个长度为n的数列A,有m个询问,每次给定一个整数T,求出最大的k,满足a[1],a[2]……a[k]的和小于等于T(不会打sigm ...

  7. RMQ 模板题 poj 3264

    题目:点这里 题意:给一个长度n的数列,然后又Q个询问,问L   到R   中最大值与最小值的差. 分析:RMQ 的模板题. 代码: #include<stdio.h> #include& ...

  8. LCA和RMQ

    下面写提供几个学习LCA和RMQ的博客,都很通熟易懂 http://dongxicheng.org/structure/lca-rmq/ 这个应该是讲得最好的,且博主还有很多其他文章,可以读读,感觉认 ...

  9. RMQ (Range Minimal Query) 问题 ,稀疏表 ST

    RMQ ( 范围最小值查询 ) 问题是一种动态查询问题,它不需要修改元素,但要及时回答出数组 A 在区间 [l, r] 中最小的元素值. RMQ(Range Minimum/Maximum Query ...

随机推荐

  1. 阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制

    新建项目 把之前项目src下的内容全部复制过来 pom.xml内复制过来 开始配置 新建一个config的包,然后再新建配置文件类SpringConfiguration @Configuration这 ...

  2. 阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版

    遍历枚举 改造获取的方法,这样获取的对象就是单例模式 再次运行测试程序 对象只有一个实例的情况下对i这个值进行了反复的操作.当多个人活着多线程在使用时.这就会出现类成员变量由于第一个人的修改.后面看到 ...

  3. LoadRunner 技巧之 自动关联

    LoadRunner 技巧之 自动关联 这一节讲loadunner 关联的问题,其实这个东西理解起来简单,但说起来比较麻烦. 关联的原理:                               ...

  4. 2019.03.30 Dialog demo 一个标准使用的dialog程序

    PROGRAM zdemo_dialog. INCLUDE zdemo_dialogtop. INCLUDE zdemo_dialogo01. INCLUDE zdemo_dialogi01. INC ...

  5. linux下mongodb程序和c++客户端的编译

    2016-4-6     14:17:15   安装前准备:1/ 安装boost库2/ 安装scons程序 方法一:$ git clone git://github.com/mongodb/mongo ...

  6. USACO4.3 Buy Low, Buy Lower【简单dp·高精度】

    如果没有方案数的话,这道题水的不得了,裸的最长下降子序列. 但是它有方案数,所以... 一个是方案数的求法: 设$f[i]$是以$a[i]$结尾的最长下降子序列的长度,可以$n^2$$dp$出答案 如 ...

  7. HDU2196 Computer【换根dp】

    题目传送门 题意: 给定一个$N$个点的树,第$i$条边的长度是$A_i$,求每个点到其他所有点的最长距离.数据范围:$n ≤ 10000$,$A_i ≤ 10_9$ 分析 首先,从随便哪个节点($1 ...

  8. 【Qt开发】Qt5.7串口开发

    QT5有专门的串口类:  QSerialPort:提供访问串口的功能  QSerialPortInfo:提供系统中存在的串口的信息  具体使用方法:  1.在pro文件中加入: QT += seria ...

  9. MySQL数据库的常见操作

    1.查看所有的数据库 1 show databases; 2.创建数据库  后面的时编码格式 1 create database dbName charset='utf8'; 3.使用/切换数据库 1 ...

  10. C语言作业09

    问题 答案 这个作业属于那个课程 C语言程序设计 这个作业要求在哪里 https://i.cnblogs.com/EditPosts.aspx?opt=1 我在这个课程的目标是 在学好C语言编程的基础 ...