BZOJ1047:[HAOI2007]理想的正方形
浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=1047
对于每一行用单调不增和单调不减队列分别维护最小值和最大值。
对于列,也用单调不增和单调不减队列分别维护最小值和最大值。
步骤如下:
\(1\)、每一行分别把前\(n\)个数的单调队列建好。
\(2\)、取出每一行队头的元素用列的单调队列维护并更新答案。
\(3\)、把每一行在\([2,n+1]\)的元素用单调队列维护好,依次类推,直到\([b-n+1,b]\)的答案被统计完。
时间复杂度:\(O(ab)\)
空间复杂度:\(O(ab)\)
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1005;
int list1[maxn],list2[maxn];
int a,b,n,head1,tail1,head2,tail2,ans=2e9;
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct Queue_mn {
int head,tail;
int list[maxn],a[maxn];
void ins(int id) {
while(head!=tail&&a[list[tail-1]]>a[id])tail--;
while(head!=tail&&id-list[head]>=n)head++;list[tail++]=id;
}
int front() {
return a[list[head]];
}
}Mn[maxn];
struct Queue_mx {
int head,tail;
int list[maxn],a[maxn];
void ins(int id) {
while(head!=tail&&a[list[tail-1]]<a[id])tail--;
while(head!=tail&&id-list[head]>=n)head++;list[tail++]=id;
}
int front() {
return a[list[head]];
}
}Mx[maxn];
int main() {
a=read(),b=read(),n=read();
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++)
Mn[i].a[j]=Mx[i].a[j]=read();
for(int i=1;i<=a;i++)
for(int j=1;j<n;j++)
Mn[i].ins(j),Mx[i].ins(j);
for(int i=n;i<=b;i++) {
for(int j=1;j<=a;j++)
Mn[j].ins(i),Mx[j].ins(i);
head1=tail1=head2=tail2=0;
for(int j=1;j<=a;j++) {
int mn=Mn[j].front(),mx=Mx[j].front();
while(head1!=tail1&&Mn[list1[tail1-1]].front()>mn)tail1--;
while(head1!=tail1&&j-list1[head1]>=n)head1++;list1[tail1++]=j;
while(head2!=tail2&&Mx[list2[tail2-1]].front()<mx)tail2--;
while(head2!=tail2&&j-list2[head2]>=n)head2++;list2[tail2++]=j;
if(j>=n)ans=min(ans,Mx[list2[head2]].front()-Mn[list1[head1]].front());
}
}
printf("%d\n",ans);
return 0;
}
BZOJ1047:[HAOI2007]理想的正方形的更多相关文章
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...
- [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列
理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...
- BZOJ1047[HAOI2007]理想的正方形——二维ST表
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...
- BZOJ1047: [HAOI2007]理想的正方形
传送门 蛤省省选果然水啊,我这种蒟蒻都能一遍A. 横向纵向维护两个单调队列,做两次求最大和最小的,总复杂度$O(NM)$ 码农题,考察代码实现能力 //BZOJ 1047 //by Cydiater ...
- [BZOJ1047][HAOI2007]理想的正方形(RMQ+DP)
题意 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 思路 RMQ求 再DP 代码 #include<cstdio> #i ...
- 【单调队列】bzoj1047 [HAOI2007]理想的正方形
先把整个矩阵处理成b[n][m-K+1].c[n][m-K+1]大小的两个矩阵,分别存储每行每K个数中的最大.最小值,然后再通过b.c处理出d.e分别表示K*K大小的子矩阵中的最大.最小值即可.单调队 ...
- [BZOJ1047][HAOI2007]理想的正方形 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 我们对每矩阵的一列维护一个大小为$n$的单调队列,队中元素为矩阵中元素.然后扫描每一 ...
- bzoj1047 [HAOI2007]理想的正方形——二维单调队列
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 就是先对行做一遍单调队列,再对那个结果按列做一遍单调队列即可. 代码如下: #incl ...
- [Bzoj1047][HAOI2007]理想的正方形(ST表)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 题目虽然有一个n的限制,但求二维区间最值首先想到的还是RMQ,但是如果按照往常RM ...
随机推荐
- linux 基础二---用户群租权限
用户&群组&权限 一.用户 1.用户及passwd文件 1) 掌握/etc/passwd文件的功能:存储所有用户的相关信息,该文件也被称为用户信息数据库(Database). 2) / ...
- Django框架之自定义分页
分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置. 1.设定每页显示数据条数 2.用户输入页码(第一页.第二页...) 3.根据设定的每页显示条数和当 ...
- Centos系统 上下文切换的检查思路
1.什么是上下文切换(Context Switch)? 上下文切换,有时也称做进程切换或任务切换,是指CPU从一个进程或线程切换到另一个进程或线程. 操作系统可以同时运行多个进程, 然而一颗CPU同时 ...
- MIPI DBI\DPI\DSI简介【转】
本文转载自:http://blog.csdn.net/longxiaowu/article/details/24249971 (1)DBI接口 A,也就是通常所讲的MCU借口,俗称80 system接 ...
- phpMyAdmin中config.inc.php设置密码和修改密码的方法
phpMyAdmin有3种授权模式: 1. cookie: 显示一个web登录页面,输入mysql的用户名和密码,然后进入管理界面. $cfg['Servers'][$i]['auth_type'] ...
- JSP的动态Include的静态Include
1. 静态导入示例 先总结: 1:静态include是把被引入的文件拼接到本页面中,再做为一个整体来编译,返回结果给客户端. 动态include是分别编译本页面和被引入的页面,再把结果合成一个html ...
- poj 3126 Bfs
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14539 Accepted: 8196 Descr ...
- CSU 1786 莫队+KDTree
题意 给出n个二维点(2e5) 和 q个询问(1e4) 每个询问给lr 问点l到r间有多少对点的曼哈顿距离<=d 点的坐标<=108 想出了莫队算法 复杂度n^1.5 看起来很科学 但是每 ...
- Flume的Avro Sink和Avro Source研究之二 : Avro Sink
啊,AvroSink要复杂好多:< 好吧,先确定主要问题: AvroSink为啥这么多代码?有必要吗?它都有哪些逻辑需要实现? 你看,avro-rpc-quickstart里是这么建client ...
- Codeforces Round #374 (Div. 2) D. Maxim and Array 线段树+贪心
D. Maxim and Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...