RMQ 2d 模板
#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 模板的更多相关文章
- poj 3264 Balanced Lineup (RMQ算法 模板题)
RMQ支持操作: Query(L, R): 计算Min{a[L],a[L+1], a[R]}. 预处理时间是O(nlogn), 查询只需 O(1). RMQ问题 用于求给定区间内的最大值/最小值问题 ...
- RMQ(模板 ST 区间最值,频繁的间隔时间)
PS: 介绍:http://blog.csdn.net/liang5630/article/details/7917702 RMQ算法.是一个高速求区间最值的离线算法,预处理时间复杂度O(n*log( ...
- ZOJ 2859 二维RMQ(模板)
这题求范围最小值,RMQ正好是用来解决这方面的.所以再适合只是了,又是离线静态输入输出的,所以时间比二维线段树快. #include<iostream> #include<cstdi ...
- rmq问题模板处理
rmq问题: 先贴一下定义 范围最值查询 维基百科,自由的百科全书 范围最值查询(Range Minimum Query),是针对数据集的一种条件查询.若给定一个数组 A[1, n],范围最值查询指定 ...
- RMQ算法模板
分别写了下标从0和1开始的两种 #include<stdio.h> #include<string.h> #include<algorithm> #include& ...
- 倍增算法总结 ( 含RMQ模板)
部分题目来自<算法竞赛设计进阶> 问题 给定一个长度为n的数列A,有m个询问,每次给定一个整数T,求出最大的k,满足a[1],a[2]……a[k]的和小于等于T(不会打sigm ...
- RMQ 模板题 poj 3264
题目:点这里 题意:给一个长度n的数列,然后又Q个询问,问L 到R 中最大值与最小值的差. 分析:RMQ 的模板题. 代码: #include<stdio.h> #include& ...
- LCA和RMQ
下面写提供几个学习LCA和RMQ的博客,都很通熟易懂 http://dongxicheng.org/structure/lca-rmq/ 这个应该是讲得最好的,且博主还有很多其他文章,可以读读,感觉认 ...
- RMQ (Range Minimal Query) 问题 ,稀疏表 ST
RMQ ( 范围最小值查询 ) 问题是一种动态查询问题,它不需要修改元素,但要及时回答出数组 A 在区间 [l, r] 中最小的元素值. RMQ(Range Minimum/Maximum Query ...
随机推荐
- Python之变量以及类型
为了更充分的利用内存空间以及更有效率的管理内存,变量是有不同的类型的,如下所示: 怎样知道一个变量的类型呢? 在python中,只要定义了一个变量,而且它有数据,那么它的类型就已经确定了,不需要咱们开 ...
- json -- fastjson如何序列化@Transient的字段
今天把fastjson包改成了1.2.58,发现@Transient标注的字段序列化后不见了,但是项目需要把@Transient字段序列化,处理方法: 原文:https://github.com/al ...
- Python中转换角度为弧度的radians()方法
Python中转换角度为弧度的radians()方法 这篇文章主要介绍了Python中转换角度为弧度的radians()方法,是Python入门中的基础知识,需要的朋友可以参考下 radians()方 ...
- 【ABAP系列】SAP BOM反查
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP BOM反查 前言部分 ...
- Logistic回归实战篇之预测病马死亡率
利用sklearn.linear_model.LogisticRegression训练和测试算法. 示例代码: import numpy as np import matplotlib.pyplot ...
- CF1187E Tree Painting【换根dp】
题目传送门 题意 一棵$N$个节点的树,初始时所有的节点都是白色,第一次可以选择任意一个把它涂成黑色.接下来,只能把与黑色节点原来相连的白色节点涂成黑色(涂成黑色的点视为被删去,与其它节点不相连).每 ...
- 【Python开发】【神经网络与深度学习】网络爬虫之图片自动下载器
python爬虫实战--图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识(没看的赶紧去看)大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk is cheap show ...
- form 源码刨析
def clean_name(self) value = self.cleaned_data.get('name') if "金-瓶-梅" not in value: raise ...
- 从零开始学习GDI+ (三) 画笔与画刷
- HDU 1087 Super Jumping! Jumping! Jumping! (动态规划、最大上升子序列和)
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...