题目:Cornfields

只是注意本题数据定义小一点,不然会超内存。

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
const int N = 255;
int n, b, k;
short val[N][N];
short dpmax[N][N][10][10];
short dpmin[N][N][10][10];
void ST()
{
int i, j, r, c, k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dpmax[i][j][0][0]=dpmin[i][j][0][0]=val[i][j];
k=(int)(log(double(n))/log(2.0));
for(i=0;i<=k;i++)
{
for(j=0;j<=k;j++)
{
if(i==0&&j==0)  continue;
for(r=1;r+(1<<i)-1<=n;r++)
{
for(c=1;c+(1<<j)-1<=n;c++)
{
if(i==0)
{
dpmax[r][c][i][j]=max(dpmax[r][c][i][j-1],dpmax[r][c+(1<<(j-1))][i][j-1]);
dpmin[r][c][i][j]=min(dpmin[r][c][i][j-1],dpmin[r][c+(1<<(j-1))][i][j-1]);
}
else
{
dpmax[r][c][i][j]=max(dpmax[r][c][i-1][j],dpmax[r+(1<<(i-1))][c][i-1][j]);
dpmin[r][c][i][j]=min(dpmin[r][c][i-1][j],dpmin[r+(1<<(i-1))][c][i-1][j]);
}
}
}
}
}
}
short query(int r1, int c1, int r2, int c2)
{
int kr=(int)(log(double(r2-r1+1))/log(2.0));
int kc=(int)(log(double(c2-c1+1))/log(2.0));
short t1=dpmax[r1][c1][kr][kc];
short t2=dpmax[r2-(1<<kr)+1][c1][kr][kc];
short t3=dpmax[r1][c2-(1<<kc)+1][kr][kc];
short t4=dpmax[r2-(1<<kr)+1][c2-(1<<kc)+1][kr][kc];
short m1=dpmin[r1][c1][kr][kc];
short m2=dpmin[r2-(1<<kr)+1][c1][kr][kc];
short m3=dpmin[r1][c2-(1<<kc)+1][kr][kc];
short m4=dpmin[r2-(1<<kr)+1][c2-(1<<kc)+1][kr][kc];
return max(max(t1,t2),max(t3,t4))-min(min(m1,m2),min(m3,m4));
}
int main()
{
int i, j;
int r1,c1,r2,c2;
while(~scanf("%d%d%d",&n,&b,&k))
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&val[i][j]);
ST();
while(k--)
{
scanf("%d%d",&r1,&c1);
r2=r1+b-1;
c2=c1+b-1;
printf("%d\n",query(r1,c1,r2,c2));
}
}
return 0;
}

POJ2019(二维RMQ问题 ST)相关推荐

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

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...

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

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...

  3. 理想的正方形 HAOI2007(二维RMQ)

    理想的正方形 省队选拔赛河南  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master       题目描述 Description 有一个a*b的整数组成的矩阵,现 ...

  4. poj2019(二维RMQ)

    题目连接:http://poj.org/problem?id=2019 只是增加一个维度,类比一维即可. 好理解,但是可以做的更好http://www.cnblogs.com/yijiull/p/67 ...

  5. HDU2888(二维RMQ)

    题目:Check Corners 本题碉堡了,内存限制好紧,再大一点都不行,还只能用int,开始用short WA了好多次..... 题意:给一个矩阵,然后给Q个询问,每个询问有四个数,分别代表询问的 ...

  6. Codeforces713D(二维RMQ)

    区间最大子正方形问题. 预处理后二分答案验证 AC Code: #include<bits/stdc++.h> #define maxn 1005 #define lim 10 using ...

  7. 模板 - 数据结构 - ST表 + 二维ST表

    区间最大值,$O(nlogn)$ 预处理,$O(1)$ 查询,不能动态修改.在查询次数M显著大于元素数量N的时候看得出差距. 令 $f[i][j]$ 表示 $[i,i+2^j-1]$ 的最大值. 显然 ...

  8. P2216 [HAOI2007]理想的正方形 ( 二维ST表 )

    题目链接:点击进入 题目 思路 maxx [ i ] [ j ] :左上角坐标 ( i , j ) ,边长为 2 k 2^k 2k 的正方形的最大值 minn [ i ] [ j ] :左上角坐标 ( ...

  9. RMQ的ST算法(区间最值)

    ST算法求解RMQ问题(区间最值) 效率:O(n log n)预处理,O(1)询问 思想: 用 f [ i ][ j ] 表示 以i 开头的区间,包括2^j 个元素的一段区间的最值 那么有初始化的初始 ...

最新文章

  1. vb.net2019- 机器学习ml.net情绪分析(1)
  2. 攻防世界-web-unfinish-从0到1的解题历程writeup
  3. 微软为.NET程序员带来了最优的跨平台开发体验-WSL
  4. Git学习小记之分支原理
  5. 九章基础算法02:栈和队列
  6. 线程之成员变量的线程共享
  7. Linux环境下一种比较有用的多线程程序调试技巧
  8. 黄永成think php rest,Rest控制器
  9. 12306抢票,12306抢票工具神奇插件3个
  10. [18调剂]上海海洋大学2018年硕士研究生调剂政策与规则
  11. 随机数——Random
  12. 微信小程序识别图片并提取文字_分享一个 OCR 文字识别,高效图片转文字的微信小程序...
  13. [Unity+Android]横版扫描二维码
  14. Traefik v2.9-IngressRoute
  15. 移动端混合开发之a标签的坑
  16. python读取Excel文件是报(xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record; fo
  17. SSO单点登录(集成SSO认证服务)
  18. android开发过程中一些遇到的问题
  19. dp的定义原理和dpi ppi px pt sp之间的区别
  20. 移动POS机刷信用卡时需要打开GPS定位吗?移动pos机GPS定位的好处有啥?

热门文章

  1. vue指令-循环指令
  2. 百万数据报表导出:原理分析与总结
  3. 私有属性和方法-伪私有属性和方法
  4. plsql(轻量版)_记录类型2
  5. DoubleCheck双重检查实战及原理解析
  6. win7电脑总是提示重新启动计算机以完成重要更新的安装是怎么回事,Win7开机时弹出Windows Update提示,怎样解决?(图文)...
  7. python把汉字转换为二进制数_在Python中,如何将8位二进制数转换为ASCII字符?
  8. 210228Linux 条件变量 线程池
  9. 【报错笔记】运行Maven项目时发现项目Build错误
  10. Spring Boot 整合 Shiro