#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. 清空mysql数据

    delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内 ...

  2. Kubernetes 中文文档

    Kubernetes 中文文档 如果想学习 Kubernetes 的小伙伴,可以参考如下文档学习: https://www.kubernetes.org.cn/docs 文档中详细讲解了 k8s 的设 ...

  3. Delphi实现带有格式的Excel导出功能

    功能预览 运行预览 模板样式 存储返参 导出的Excel 2. 代码实现 //执行sql的函数 procedure TForm1.GetReportData(astrsql:string); var ...

  4. 【Java学习笔记】LinkedList JDK1.6

    如下一段代码,在JDK1.6的LinkedList中,是下图这样存储的.有一个节点值为null的节点,叫做header,header的next是0,3的next是header,这是一个循环链表 Lin ...

  5. eetCode刷题-递归篇

    递归是算法学习中很基本也很常用的一种方法,但是对于初学者来说比较难以理解(PS:难点在于不断调用自身,产生多个返回值,理不清其返回值的具体顺序,以及最终的返回值到底是哪一个?).因此,本文将选择Lee ...

  6. python 并发编程 多线程 多线程实现并发的套接字通信

    进程内会生成一个主线程,让主线程执行server函数,server函数核心是accept(),让主线程干accept的工作, 建立连接,每建立一个连接应该执行通信函数 每建立一个连接就是生成一个子线程 ...

  7. excel常用公式--逻辑运算类

    if:  IF(logical_test, value_if_true, [value_if_false]). and: 逻辑判断,相当于“并”. or: 逻辑判断,相当于“或”.

  8. SQLSERVER 秘钥整理

    SQLSERVER 2017 Enterprise Core 6GPYM-VHN83-PHDM2-Q9T2R-KBV83 Developer ---- Enterprise TDKQD-PKV44-P ...

  9. pair常见用法

    pair的使用 关于pair 什么是pair 可以将pair看做一个内部有两个元素的结构体,且两个元素的类型是可以指定的. struct pair{ typename1 first; typename ...

  10. 利用ansible进行主机信息收集

    --- - hosts: myjob gather_facts: True vars: IP: "{{ ansible_default_ipv4['address'] }}" HO ...