[题解](单调队列)luogu_P2216_BZOJ_1047 理想的正方形
调了半天,发现这个写法确实极易错......
对于每列都维护一个单调队列记录最大最小值,这样一次操作后就把最大最小值压到了一维,
然后再对这一行维护一个单调队列,每次更新ans值,然而对于数组和队列下标的访问极易搞错
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=;
int n,m,k,ans=0x7fffffff,a[maxn][maxn];
deque<int>ymax[maxn],ymin[maxn],xmax,xmin;
int abs(int a){return a>?a:-a;}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&a[i][j]); for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
while(!ymax[j].empty() && a[ymax[j].back()][j]<a[i][j])ymax[j].pop_back();
while(!ymax[j].empty() && ymax[j].front()+k<=i)ymax[j].pop_front();
ymax[j].push_back(i);
}
for(int j=;j<=m;j++){
while(!ymin[j].empty() && a[ymin[j].back()][j]>a[i][j])ymin[j].pop_back();
while(!ymin[j].empty() && ymin[j].front()+k<=i)ymin[j].pop_front();
ymin[j].push_back(i);
}
if(i<k)continue;//还不能成为正方形就先跳过
//此时已压成一行,滑动窗口即可
xmin.clear();xmax.clear();//不能忘了初始化
for(int j=;j<=m;j++){
while(!xmax.empty() && a[ymax[xmax.back()].front()][xmax.back()]<a[ymax[j].front()][j])xmax.pop_back();
while(!xmax.empty() && xmax.front()+k<=j)xmax.pop_front();
xmax.push_back(j);
while(!xmin.empty() && a[ymin[xmin.back()].front()][xmin.back()]>a[ymin[j].front()][j])xmin.pop_back();
while(!xmin.empty() && xmin.front()+k<=j)xmin.pop_front();
xmin.push_back(j);
if(j<k)continue;
ans=min(ans,abs(a[ymin[xmin.front()].front()][xmin.front()]-a[ymax[xmax.front()].front()][xmax.front()]));
}
}
printf("%d\n",ans);
}
[题解](单调队列)luogu_P2216_BZOJ_1047 理想的正方形的更多相关文章
- 一码学程 10284 排队找bug 题解 单调队列 或者 线段树RMQ
注:只是看到题目,未评测,所以不确定代码正确性,但是算法思路没有问题 描述 同学们的bug还真是多啊,orz... 春节期间大家存下的bug都来找肖老师解决了. 每个人都有bug,但是肖老师却只有一个 ...
- [Luogu 2216] [HAOI2007]理想的正方形
[Luogu 2216] [HAOI2007]理想的正方形 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输 ...
- HDU 5749 Colmerauer 单调队列+暴力贡献
BestCoder Round #84 1003 分析:(先奉上zimpha巨官方题解) 感悟:看到题解单调队列,秒懂如何处理每个点的范围,但是题解的一句算贡献让我纠结半天 已知一个点的up,do ...
- 【POJ 2823】Sliding Window(单调队列/堆)
BUPT2017 wintertraining(16) #5 D POJ - 2823 题意 给定n,k,求滑窗[i,i+k-1]在(1<=i<=n)的最大值最小值. 题解 单调队列或堆. ...
- 【bzoj3831】[Poi2014]Little Bird 单调队列优化dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6826475.html 题目描述 In the Byteotian Line Forest there are t ...
- [luogu]P3572 [POI2014]PTA-Little Bird(单调队列)
P3572 [POI2014]PTA-Little Bird 题目描述 In the Byteotian Line Forest there are nn trees in a row. On top ...
- 【DP】【单调队列】洛谷 P2216 [HAOI2007]理想的正方形 题解
算是单调队列的复习吧,不是很难 题目描述 有一个$a\times b$的整数组成的矩阵,现请你从中找出一个$n\times n$的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 ...
- 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)
[BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
随机推荐
- NOIP2015_提高组Day2_3_运输计划
这题思路很简单: 先对每个询问求距离,对距离由大到小排序, 二分最小距离,验证是否可行,验证时用差分处理: #include<iostream> #include<cstring&g ...
- WebDriver API——延时操作及元素等待
在自动化测试过程当中,受网络.测试设备等诸多因素的影响,我们经常需要在自动化测试脚本中添加一些延时来更好的定位元素来进行一系列的操作. 一般有这么几种方式: 1.implicitlyWait.识别对象 ...
- windows下的host文件在哪里,有什么作用?
在Window系统中有个Hosts文件(没有后缀名),在Windows98系统下该文件在Windows目录,在Windows2000/XP系统中位于C:\Winnt\System32\Drivers\ ...
- html5--4-5 embed元素及其他
html5--4-5 embed元素及其他 学习要点 掌握embed元素的使用 了解object元素的使用 温馨提示:关于video和audio的事件方法等涉及都JavaScript知识的内容,暂时不 ...
- 使用geolocation
The geolocation object geolocation API建立在navigator.geolocation 上. 如果对象存在,才可以使用定位服务. if ("geoloc ...
- Kvm学习文档记录
一.实验环境: 在vmware上打开vt支持选项: 操作系统信息: [root@node2 ~]# cat /etc/issue CentOS release 6.6 (Final) Kernel \ ...
- C++之log4cpp库的使用
log4..简介 log4..是基于log4j的一系列的c++移植版本,使用了log4j的模式结构,目前主要有以下几个版本: 1. log4cxx, 目前是到0.10.0版,Apache下的孵化项目, ...
- npm --- Node.js包管理器
目录 1. 安装Node.js 2. 运行npm 3. npm介绍 3.1 安装插件 3.2 更新插件 3.3 卸载插件 3.4 查看当前目录中的插件列表 4. 使用cnpm 4.1 安装 npm( ...
- TX1 ssh配置
执行: sudo apt-get install openssh-server 验证: sudo ps -e |grep ssh 回车-->有sshd,说明ssh服务已经启,如果没有则输入命令s ...
- js格式
/** * Created by admin on 2017/9/22. */ // 分号后不要再有多余的空格 var name = "North"; var name = &qu ...