[poj2019]Cornfields(二维RMQ)

题意:给你一个n*n的矩阵,让你从中圈定一个小矩阵,其大小为b*b,有q个询问,每次询问告诉你小矩阵的左上角,求小矩阵内的最大值和最小值的差。

解题关键:二维st表模板题。

预处理复杂度:$O({n^2}\log n)$

查询复杂度:$O(n)$

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<iostream>
 6 #include<cmath>
 7 #define inf 0x3f3f3f3f
 8 using namespace std;
 9 typedef long long ll;
10 int arr[252][252];
11 int max1[255][255][10],min1[255][255][10];
12 int n,b,k;
13 void rmq_init(int n){
14     int lg=int(log(n)/log(2));
15     for(int i=1;i<=n;i++){
16         for(int j=1;j<=n;j++){
17             max1[i][j][0]=min1[i][j][0]=arr[i][j];
18         }
19     }
20     for(int i=1;i<=n;i++){
21         for(int j=1;j<=lg;j++){
22             for(int k=1;k<=n;k++){
23                 max1[i][k][j]=max(max1[i][k][j-1],max1[i][k+(1<<(j-1))][j-1]);
24                 min1[i][k][j]=min(min1[i][k][j-1],min1[i][k+(1<<(j-1))][j-1]);
25             }
26         }
27     }
28 }
29 int query(int x,int y){
30     int k=int(log(b)/log(2.0));
31     int maxd=-inf,mind=inf,tmp1,tmp2,yr=y+b-1;
32     for(int i=x;i<=x+b-1;i++){
33         tmp1=max(max1[i][y][k],max1[i][yr-(1<<k)+1][k]);//k询问时就不需要再减1了
34         tmp2=min(min1[i][y][k],min1[i][yr-(1<<k)+1][k]);
35         maxd=max(tmp1,maxd);
36         mind=min(tmp2,mind);
37     }
38     return maxd-mind;
39 }
40 int main(){
41     ios::sync_with_stdio(0);
42     while(cin>>n>>b>>k){
43         for(int i=1;i<=n;i++){
44             for(int j=1;j<=n;j++){
45                 cin>>arr[i][j];
46             }
47         }
48         rmq_init(n);
49         int a,b;
50         while(k--){
51             cin>>a>>b;
52             int ans=query(a,b);
53             cout<<ans<<"\n";
54         }
55     }
56     return 0;
57 }
时间: 2024-11-06 14:33:12

[poj2019]Cornfields(二维RMQ)的相关文章

POJ 2019 Cornfields 二维RMQ

题目来源:POJ 2019 Cornfields 题意:求正方形二维区间最大最小值的差 思路:直接二维ST搞 试模版而已 #include <cstdio> #include <algorithm> #include <cmath> using namespace std; const int maxn = 255; int dp[maxn][maxn][8][8]; int dp2[maxn][maxn][8][8]; int a[maxn][maxn]; int n

POJ2019 Cornfields 二维ST表

网址:https://vjudge.net/problem/POJ-2019 题意: 给出一个矩阵,求左下角坐标为$(x,y)$,长度为$b$的正方形的包含的数的最大值和最小值. 题解: 一.二维ST表: 一维$ST$表可以快速处理一维$RMQ$问题,这次是二维问题,好,那就上二维$ST$表,构造方法和一维的类似.开一个四维数组,第一维第三维管横行,第二维第四维管纵行即可(反过来也行).然后处理完之后按照类似于一维$ST$表一样查询,查询四个小矩阵的最值就行,然后取最值,具体看代码. AC代码:

poj2019(二维RMQ)

题目连接:http://poj.org/problem?id=2019 只是增加一个维度,类比一维即可. 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=270; 7 int p[maxn][maxn]; 8 int pmax[maxn][maxn][20]; 9 int

Cornfields poj2019 二维RMQ

Cornfields Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Description FJ has decided to grow his own corn hybrid in order to help the cows make the best possible milk. To that end, he's looking to build the

HDU 2888:Check Corners(二维RMQ)

http://acm.hdu.edu.cn/showproblem.php?pid=2888 题意:给出一个n*m的矩阵,还有q个询问,对于每个询问有一对(x1,y1)和(x2,y2),求这个子矩阵中的最大值,和判断四个角有没有等于这个最大值的. 思路:二维RMQ模板题.注意内存卡的挺紧的. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5

【bzoj1047】[HAOI2007]理想的正方形 二维RMQ

题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数.每行相邻两数之间用一空格分隔.100%的数据2<=a,b<=1000,n<=a,n<=b,n<=1000 输出 仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值. 样例输入 5 4 2 1 2 5 6 0 1

[hdu2888]二维RMQ

题意:求矩形内最大值.二维RMQ. 1 #pragma comment(linker, "/STACK:10240000,10240000") 2 3 #include <iostream> 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstdlib> 7 #include <cstring> 8 #include <map> 9 #include

HDU2888 Check Corners(二维RMQ)

有一个矩阵,每次查询一个子矩阵,判断这个子矩阵的最大值是不是在这个子矩阵的四个角上 裸的二维RMQ 1 #pragma comment(linker, "/STACK:1677721600") 2 #include <map> 3 #include <set> 4 #include <stack> 5 #include <queue> 6 #include <cmath> 7 #include <ctime> 8

P2216 [HAOI2007]理想的正方形(二维RMQ)

题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数.每行相邻两数之间用一空格分隔. 输出格式: 仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值. 输入输出样例 输入样例#1: 5 4 2 1 2 5 6 0 17 16 0 16 17 2 1 2 10 2