Description

约翰决定培育新的玉米品种以提高奶牛的产奶效率。约翰所有的土地被分成 N ×N 块,其中第 r行第 c 列的玉米质量为 Ar,c。他打算找一块质量比较均匀的土地开始自己的实验。经过前期考察,他已经锁定了 K 片区域作为实验基地的候选,其中第 i 片区域是从 Ri 行 Ci 列开始,到 Ri + B − 1 行Ci +B −1 列结束的一个 B ×B 的区域。请帮助约翰计算一下,在这些候选区域里,玉米的最高质量与最低质量之差分别是多少。

Input Format

• 第一行:三个整数 N,B 和 K,1 ≤ B ≤ N ≤ 250,1 ≤ K ≤ 10^5

• 第二行到 N +1 行:第 i+1 行有 N 个整数,分别表示 Ai,1 到 Ai,N,对所有 1 ≤ j ≤ N,满足0 ≤ Ai,j ≤ 250

• 第 N + 2 行到第 N + K + 1 行:第 N + i + 1 行有两个整数 Ri 和 Ci,1 ≤ Ri,Ci ≤ N

Output Format

• 第一行到第 K 行:第 i 行表示第 i 片候选区域中最高质量与最低质量之差

Solution

显然的单调队列,\(mx[i][j]\)表示第\(i\)行区间\([j-b,j]\)的最大值,\(mi[i][j]\)同理,写个单调队列即可,

时间复杂度\(O(n^2)\),

Code

#include <cstdio>
#include <algorithm>
#include <list>
#define N 260
using namespace std; list<int> Qmx,Qmi;
int n,b,k,A[N],mx[N][N],mi[N][N]; inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch = getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch = getchar();}
return x*f;
} int main(){
n=read(),b=read(),k=read();
for(int i=1;i<=n;++i){
Qmx.clear();Qmi.clear();
for(int j=1;j<=n;++j){
A[j]=read();
while(!Qmx.empty()&&A[Qmx.back()]<=A[j]) Qmx.pop_back();
Qmx.push_back(j);
while(!Qmx.empty()&&Qmx.front()<=j-b) Qmx.pop_front();
mx[i][j]=A[Qmx.front()]; while(!Qmi.empty()&&A[Qmi.back()]>=A[j]) Qmi.pop_back();
Qmi.push_back(j);
while(!Qmi.empty()&&Qmi.front()<=j-b) Qmi.pop_front();
mi[i][j]=A[Qmi.front()];
}
} while(k--){
int x=read(),y=read();
int Max=-1e9,Min=1e9;
for(int i=x;i<=x+b-1;++i){
Max=max(Max,mx[i][y+b-1]);
Min=min(Min,mi[i][y+b-1]);
}
printf("%d\n",Max-Min);
}
return 0;
}

[USACO]玉米实验(单调队列)的更多相关文章

  1. 【USACO】玉米实验(单调队列)

    Description 约翰决定培育新的玉米品种以提高奶牛的产奶效率.约翰所有的土地被分成 N ×N 块,其中第 r行第 c 列的玉米质量为 Ar,c.他打算找一块质量比较均匀的土地开始自己的实验.经 ...

  2. 【USACO】又买饲料 单调队列dp

    题目描述 约翰开车回家,又准备顺路买点饲料了(咦?为啥要说“又”字?)回家的路程一共有 E 公里, 这一路上会经过 N 家商店,第 i 家店里有 F i 吨饲料,售价为每吨 C i 元.约翰打算买 K ...

  3. USACO 2009 Open 干草塔 Tower of Hay(贪心+单调队列优化DP)

    https://ac.nowcoder.com/acm/contest/1072/B Description 为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上 ...

  4. 单调队列(数列中长度不超过k的子序列和的最值)

    ★实验任务 小 F 很爱打怪,今天因为系统 bug,他提前得知了 n 只怪的出现顺序以及击 倒每只怪得到的成就值 ai.设第一只怪出现的时间为第 1 秒,这个游戏每过 1 秒 钟出现一只新怪且没被击倒 ...

  5. [acmm week12]二分+dp+单调队列

    1004 抄作业         Time Limit: 1sec    Memory Limit:256MB Description Zfree虽然平时很爱学习,但是他迫于生活所迫(比如设计cpu实 ...

  6. 单调队列练习题(oj p1157 p1158 p1159)

    p1157是很气人的...自从评测机挂了后,速度就特别慢,cin已经过不了了,然而我不知道,就各种**的提交 惨兮兮惨兮兮,这还是开了小号(通过率堪忧.jpg...)... 思路就是单调队列维护,用队 ...

  7. [bzoj4698][Sdoi2008]Sandy的卡片_后缀数组_二分/单调队列_双指针

    Sandy的卡片 bzoj-4698 Sdoi-2008 题目大意:题目链接. 注释:略. 想法: 这个题跟一个Usaco的题特别像.我们把这些串差分 现在我们要求的就是公共子串且出现次数不少于$k$ ...

  8. BestCoder Round #89 B题---Fxx and game(单调队列)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945     问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路:  B ...

  9. 单调队列 && 斜率优化dp 专题

    首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...

随机推荐

  1. springcloud中servcie层调用fegin异常以及异步方法的实现

    近日在做业务上的短信推送和APP消息推送,通过调用别的模块的接口来实现,在springcloud中通过fegin进行调用.这里要说明的事情并不是如何开发推送功能,而是在调试过程中碰到的一些小问题.我把 ...

  2. Department Highest Salary

    The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...

  3. OpenCV之cvAddWeighted直接C语言实现版addWeighted,应对上下平滑融合拼接

    关于OpenCV中的cvAddWeighted的介绍可参见<opencv中的cvAddWeighted函数> cvAddWeighted有个问题,它只能实现两张图片的直接融合,往往产生明显 ...

  4. linux 后渗透测试

    学习参考: http://weibo.com/1869235073/B9Seswf9R?type=comment http://weibo.com/p/1001603723521007220513 h ...

  5. Ubuntu 14.04 安装caffe深度学习框架

    简介:如何在ubuntu 14.04 下安装caffe深度学习框架. 注:安装caffe时一定要保持网络状态好,不然会遇到很多麻烦.例如下载不了,各种报错. 一.安装依赖包 $ sudo apt-ge ...

  6. SAP成都研究院的体育故事

    "平生不识陈近南,纵称英雄也枉然". 这是清朝反government武装圈子里流传的一句话,给予了天地会CEO陈近南极高的评价. 同样,如果您是SAP体育运动界的一份子,而您还不认 ...

  7. NOIP2018提高组Day2 解题报告

    前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). \(Day2\)的题目和\(Day1\)比起来,真的是难了很多啊. \(T1\):旅行(点此看 ...

  8. 使用canvas给图片添加水印

    css部分 .clip { position: absolute; clip: rect(0 0 0 0); } html部分 <input type="file" id=& ...

  9. python剑指offer 顺时针打印指针

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  10. python_13_break

    for i in range(5): print('-----------',i) for j in range(5): print(j) if j>2: break####结束当前循环