简单的RMQ,可我怎么写都WA。不明白,找了一个和我相似的贴过了,要赶着去外婆家。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stack>
#define eps 1e-5
#define MAXN 255
#define MAXM 111111
#define INF 1000000000
using namespace std;
int mx[MAXN][MAXN][8], mi[MAXN][MAXN][8];
int n, b, q, a, c;
void rmqinit()
{
int l = int(log(double(n)) / log(2.0)) ;
for(int k = 1; k <= n ; k++)
for(int j = 1; j <= l; j++)
for(int i = 1; i + (1 << (j - 1))- 1 <= n; i++)
{
mx[k][i][j] = max(mx[k][i][j - 1], mx[k][i + (1 << (j - 1 ))][j - 1]) ;
mi[k][i][j] = min(mi[k][i][j - 1], mi[k][i + (1 << (j - 1 ))][j - 1]) ;
}
}
int rmqmax(int lx, int ly, int rx, int ry) // lx, ly为左上角的点 rx ry为右下角的点
{
int l = int(log(double(ry - ly + 1)) / log(2.0));
int ret = -1;
for(int k = lx; k <= rx ; k++)
ret = max(ret, max(mx[k][ly][l], mx[k][ry - (1 << l) + 1][l]));
return ret;
}
int rmqmin(int lx, int ly, int rx, int ry) // lx, ly为左上角的点 rx ry为右下角的点
{
int l = int(log(double(ry - ly + 1)) / log(2.0));
int ret = INF;
for(int k = lx; k <= rx ; k++)
ret = min(ret, min(mi[k][ly][l], mi[k][ry - (1 << l) + 1][l]));
return ret;
}
int main()
{
while(scanf("%d%d%d", &n, &b, &q) != EOF)
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
scanf("%d",&a);
mx[i][j][0] = mi[i][j][0] = a ;
}
rmqinit();
while(q--)
{
scanf("%d%d", &a, &c) ;
int rx = a + b - 1;
if(rx > n) rx = n;
int ry = c + b - 1;
if(ry > n) ry = n;
printf("%d\n", rmqmax(a, c, rx, ry) - rmqmin(a, c, rx, ry)) ;
}
}
return 0;
}

  

MINE:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string.h>
#include <queue>
#include <cmath>
#include <vector>
using namespace std; int num[255][255];
int f1[255][255][30];
int f2[255][255][30];
int n,b,q;
const int inf=1000000000; int rmq_max(int p,int i, int j) {
int k = (int)(log(double(j-i+1)) / log(2.0)), t1;
t1 = max(f1[p][i][k], f1[p][j - (1<<k) + 1][k]);
return t1;
}
int rmq_min(int p,int i, int j) {
int k = (int)(log(double(j-i+1)) / log(2.0)), t2;
t2 = min(f2[p][i][k], f2[p][j - (1<<k) + 1][k]);
return t2;
} int main(){
int l,u;
while(scanf("%d%d%d",&n,&b,&q)!=EOF){
int k = (int) (log((double)n) / log(2.0));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
scanf("%d",&num[i][j]);
for(int j = 0; j < n; j++) {
f1[i][j][0] = num[i][j];
f2[i][j][0] = num[i][j];
}
for(int p = 1; p <= k; p++) {
for(int t = 0; t + (1 << p) - 1 < n; t++) {
int m = t + (1 << (p - 1));
f1[i][t][p] = max(f1[i][t][p-1], f1[i][m][p-1]);
f2[i][t][p] = min(f2[i][t][p-1], f2[i][m][p-1]);
}
}
}
int maxn=-1,minn=inf;
for(int i=1;i<=q;i++){
scanf("%d%d",&u,&l);
l--;u--;
for(int p=u;p<(u+b);p++){
maxn=max(maxn,rmq_max(p,l,l+b-1));
minn=min(minn,rmq_min(p,l,l+b-1));
}
printf("%d\n",maxn-minn);
}
}
return 0;
}

  

POJ 2019的更多相关文章

  1. POJ 2019 Cornfields [二维RMQ]

    题目传送门 Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7963   Accepted: 3822 ...

  2. poj 2019 二维rmq *

    题目大意:给出一个N*N矩形,每个格子上有一个价值.询问一个b*b的矩形在左上角的位置(x,y),(x+b-1,y+b-1)这一部分的最大值-最小值是多少. 模板题 #include <stdi ...

  3. [POJ 2019] Cornfields

    Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5516   Accepted: 2714 Descri ...

  4. 二维 ST POJ 2019

    题目大意:给你一个n*n的矩阵,每次给你一个点(x,y),以其为左上角,宽度为b的矩阵中最小的数值和最大数值的差是多少?  一共k个询问. 思路:简单的二维st. 定义dp(i,j,k,L)表示以(i ...

  5. POJ 2019 Cornfields(二维RMQ)

    相比以前的RMQ不同的是,这是一个二维的ST算法 #include<iostream> #include<cstring> #include<cstdio> #in ...

  6. Cornfields POJ - 2019(二维RMQ板题)

    就是求子矩阵中最大值与最小值的差... 板子都套不对的人.... #include <iostream> #include <cstdio> #include <sstr ...

  7. POJ 2019 Cornfields (二维RMQ)

    Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4911   Accepted: 2392 Descri ...

  8. POJ 2019 Cornfields 二维线段树的初始化与最值查询

    模板到不行.. 连更新都没有.. .存个模板. 理解留到小结的时候再写. #include <algorithm> #include <iostream> #include & ...

  9. ACM第一阶段学习内容

    一.知识目录 字符串处理 ................................................................. 3 1.KMP 算法 .......... ...

随机推荐

  1. 《转》Ceilometer Alarm API 參数具体解释 及 举例说明

    Ceilometer Alarm是H版新加入的功能,监控报警是云平台必不可少的部分,Ceilometer已经实现了比較完好的监控体系.报警怎么能缺少呢?用过AWS CloudWatch Alarm的人 ...

  2. 【JSOI 2008】 球形空间产生器

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1013 [算法] 高斯消元 [代码] #include<bits/stdc++. ...

  3. 第19章 Redis的一些常用技术

    19.1 Redis的基础事务                       图19-1 Redis命令执行事务的过程                      19-1:在Spring中使用Redis ...

  4. Hdu-6242 2017CCPC-哈尔滨站 M.Geometry Problem 计算几何 随机

    题面 题意:给你n个点,让你找到一个圆,输出圆心,和半径,使得有超过一半的点刚好在圆上.n<=1e5,题目保证了有解 题解:刚开始看着很不可做的样子,但是多想想,三点确定一个圆,三点啊! 现在有 ...

  5. 虚基类——(1)定义人员类Person: 公有成员:姓名(Name); 保护成员:性别(Gender),年龄(Age); 构造函数和析构函数

    题目描述: (1)定义人员类Person: 公有成员:姓名(Name): 保护成员:性别(Gender),年龄(Age): 构造函数和析构函数 (2) 从人员类Person派生学生记录类Student ...

  6. vim下的autocmd

    AUTOCMD *autocmd.txt* For Vim version 6.2. 最后修改: 2003年3月28日 VIM 参考手册 作者:Bram Moolenaar 翻译:Zimin<c ...

  7. WPF 漏斗控件 等待沙漏效果

    由于WPF中不支持gif图片因此要实现一个漏斗沙漏效果有点小麻烦. 网上有一款开源的控件 理论上完全开源 官网 http://wpfspark.codeplex.com/贴一下效果图 大家感觉需要就在 ...

  8. JavaScript DOM 总结

    一.DOM基础1.节点(node)层次Document--最顶层的节点,所有的其他节点都是附属于它的.DocumentType--DTD引用(使用<!DOCTYPE>语法)的对象表现形式, ...

  9. 企业级Spring应用的搭建

    本次博客将要对SpringMVC做简单的介绍以及环境的搭建: 概述 Spring 框架是一个开源的平台,属于设计层面框架,整个系统面向接口,是分层的JavaSE/EE开源框架,用于解决复杂的企业应用开 ...

  10. SQL SERVER数据库状态

    一个SQL SERVER数据库会处于很多种状态,例如 ONLINE .RESTORING .RECOVERING .RECOVERY_PENDING  .SUSPECT.EMERGENCY .OFFL ...