BZOJ1047: [HAOI2007]理想的正方形
蛤省省选果然水啊,我这种蒟蒻都能一遍A。
横向纵向维护两个单调队列,做两次求最大和最小的,总复杂度$O(NM)$
码农题,考察代码实现能力
//BZOJ 1047
//by Cydiater
//2016.9.17
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <map>
#include <iomanip>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
;
const int oo=0x3f3f3f3f;
inline int read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
int N,M,K,a[MAXN][MAXN],head[MAXN],tail[MAXN],lable_max[MAXN][MAXN],lable_min[MAXN][MAXN],q[MAXN][MAXN],extro_q[MAXN],extro_head,extro_tail,ans=oo;
namespace solution{
inline void push(int co,int id){q[co][++tail[co]]=id;}
void init(){
N=read();M=read();K=read();
up(i,,N)up(j,,M)a[i][j]=read();
}
void Queue_max(){
memset(tail,,sizeof(tail));
up(i,,N)head[i]=;
up(i,,N)up(j,,K){
while(head[i]<=tail[i]&&a[i][j]>a[i][q[i][tail[i]]])tail[i]--;
push(i,j);//load y
}
extro_head=;extro_tail=;
up(i,,K-){
while(extro_head<=extro_tail&&a[i][q[i][head[i]]]>a[extro_q[extro_tail]][q[extro_q[extro_tail]][head[extro_q[extro_tail]]]])extro_tail--;
extro_q[++extro_tail]=i;//load x
}
up(i,K,N){
>K&&extro_head<=extro_tail)extro_head++;
while(extro_head<=extro_tail&&a[i][q[i][head[i]]]>a[extro_q[extro_tail]][q[extro_q[extro_tail]][head[extro_q[extro_tail]]]])extro_tail--;
extro_q[++extro_tail]=i;//load x
lable_max[i][K]=a[extro_q[extro_head]][q[extro_q[extro_head]][head[extro_q[extro_head]]]];
}
up(j,K+,M){
up(i,,N){
>K&&head[i]<=tail[i])head[i]++;
while(head[i]<=tail[i]&&a[i][j]>a[i][q[i][tail[i]]])tail[i]--;
push(i,j);//load y
}
extro_head=;extro_tail=;
up(i,,K-){
while(extro_head<=extro_tail&&a[i][q[i][head[i]]]>a[extro_q[extro_tail]][q[extro_q[extro_tail]][head[extro_q[extro_tail]]]])extro_tail--;
extro_q[++extro_tail]=i;//load x
}
up(i,K,N){
>K&&extro_head<=extro_tail)extro_head++;
while(extro_head<=extro_tail&&a[i][q[i][head[i]]]>a[extro_q[extro_tail]][q[extro_q[extro_tail]][head[extro_q[extro_tail]]]])extro_tail--;
extro_q[++extro_tail]=i;//load x
lable_max[i][j]=a[extro_q[extro_head]][q[extro_q[extro_head]][head[extro_q[extro_head]]]];
}
}
}
void Queue_min(){
memset(tail,,sizeof(tail));
up(i,,N)head[i]=;
up(i,,N)up(j,,K){
while(head[i]<=tail[i]&&a[i][j]<a[i][q[i][tail[i]]])tail[i]--;
push(i,j);//load y
}
extro_head=;extro_tail=;
up(i,,K-){
while(extro_head<=extro_tail&&a[i][q[i][head[i]]]<a[extro_q[extro_tail]][q[extro_q[extro_tail]][head[extro_q[extro_tail]]]])extro_tail--;
extro_q[++extro_tail]=i;//load x
}
up(i,K,N){
>K&&extro_head<=extro_tail)extro_head++;
while(extro_head<=extro_tail&&a[i][q[i][head[i]]]<a[extro_q[extro_tail]][q[extro_q[extro_tail]][head[extro_q[extro_tail]]]])extro_tail--;
extro_q[++extro_tail]=i;//load x
lable_min[i][K]=a[extro_q[extro_head]][q[extro_q[extro_head]][head[extro_q[extro_head]]]];
}
up(j,K+,M){
up(i,,N){
>K&&head[i]<=tail[i])head[i]++;
while(head[i]<=tail[i]&&a[i][j]<a[i][q[i][tail[i]]])tail[i]--;
push(i,j);//load y
}
extro_head=;extro_tail=;
up(i,,K-){
while(extro_head<=extro_tail&&a[i][q[i][head[i]]]<a[extro_q[extro_tail]][q[extro_q[extro_tail]][head[extro_q[extro_tail]]]])extro_tail--;
extro_q[++extro_tail]=i;//load x
}
up(i,K,N){
>K&&extro_head<=extro_tail)extro_head++;
while(extro_head<=extro_tail&&a[i][q[i][head[i]]]<a[extro_q[extro_tail]][q[extro_q[extro_tail]][head[extro_q[extro_tail]]]])extro_tail--;
extro_q[++extro_tail]=i;//load x
lable_min[i][j]=a[extro_q[extro_head]][q[extro_q[extro_head]][head[extro_q[extro_head]]]];
}
}
}
void slove(){
Queue_max();
Queue_min();
}
void output(){
/*up(i,1,N){
up(j,1,M)cout<<lable_max[i][j]<<' ';
cout<<endl;
}
puts("");
up(i,1,N){
up(j,1,M)cout<<lable_min[i][j]<<' ';
cout<<endl;
}
puts("");*/
up(i,K,N)up(j,K,M)ans=min(ans,lable_max[i][j]-lable_min[i][j]);
cout<<ans<<endl;
}
}
int main(){
//freopen("input.in","r",stdin);
using namespace solution;
init();
slove();
output();
;
}
妈的,下次再也不起这么长的变量名了,敲到手麻
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]理想的正方形(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 ...
随机推荐
- DEV winform treelist设置背景图像
treelist是一个复杂的控件,包括选中行,奇偶行等均可以单独设置显示效果,空白区域上背景图像的代码如下: private void treeList1_CustomDrawEmptyArea(ob ...
- 【BZOJ1001】狼抓兔子
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 7530 Solved: 1724[Submit][S ...
- Stem函数绘图
stem(n,x,'filled');第三个参数是绘图的样式,filled就是填充,将圆圈填充. Stem函数绘图各种不同的绘图函数分别适用于不同的场合,使用“stem”绘制针状图最简单,从附录中提供 ...
- hello Cookie
Cookie 是什么? Cookie在浏览器中的表现为请求头域和响应头域的字段,也就是伴随着请求和响应的一组键值对的文本.Cookie来源于服务器,第一次请求无Cookie参数,增加Cookie通过服 ...
- 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳
因为凸壳上对踵点的单调性所以旋转卡壳线性绕一圈就可以啦啦啦--- 先求凸包,然后旋转卡壳记录$sum1$和$sum2$,最后统计答案就可以了 #include<cmath> #includ ...
- 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)
来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...
- 系统间通信(8)——通信管理与RMI 上篇
1.概述 在概述了数据描述格式的基本知识.IO通信模型的基本知识后.我们终于可以进入这个系列博文的重点:系统间通信管理.在这个章节我将通过对RMI的详细介绍,引出一个重要的系统间通信的管理规范RPC, ...
- Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景
java的同步机制,大概是通过:1.synchronized:2.Object方法中的wait,notify:3.ThreadLocal机制来实现的, 其中synchronized有两种用法:1.对类 ...
- vim选中字符复制/剪切/粘贴
转载自:http://www.cnblogs.com/luosongchao/p/3193153.html 问题描述: vim 中选中指定字符,进行复制/剪切/粘贴 选择:1.普通模式下--v+hjk ...
- SpringMVC与Struts2区别与比较总结
1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上Spr ...