1047: [HAOI2007]理想的正方形
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 4075 Solved: 2277
[Submit][Status][Discuss]
Description
有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值
的差最小。
Input
第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每
行相邻两数之间用一空格分隔。
100%的数据2<=a,b<=1000,n<=a,n<=b,n<=1000
Output
仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。
Sample Input
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2
Sample Output
#include<iostream>
#include<cstdio>
using namespace std; const int MAXN=+;
const int INF=0x7fffffff; int a,b,n,ans=INF;
int s[MAXN][MAXN],mx[MAXN][MAXN],mn[MAXN][MAXN];
int val[MAXN],pos[MAXN],x[MAXN],y[MAXN]; int main()
{
scanf("%d %d %d",&a,&b,&n);
for(int i=;i<=a;i++)
for(int j=;j<=b;j++)
scanf("%d",&s[i][j]);
int l,r;
for(int i=;i<=a;i++)
{
l=,r=;
for(int j=;j<=b;j++)
{
while(l<r&&val[r-]<=s[i][j]) r--;
val[r]=s[i][j];pos[r]=j;r++;
if(pos[l]==j-n) l++;
if(j>=n) mx[i][j]=val[l];
}
l=,r=;
for(int j=;j<=b;j++)
{
while(l<r&&val[r-]>=s[i][j]) r--;
val[r]=s[i][j];pos[r]=j;r++;
if(pos[l]==j-n) l++;
if(j>=n) mn[i][j]=val[l];
}
}
for(int i=n;i<=b;i++)
{
l=,r=;
for(int j=;j<=a;j++)
{
while(l<r&&val[r-]<=mx[j][i]) r--;
val[r]=mx[j][i];pos[r]=j;r++;
if(pos[l]==j-n) l++;
if(j>=n) x[j]=val[l];
}
l=,r=;
for(int j=;j<=a;j++)
{
while(l<r&&val[r-]>=mn[j][i]) r--;
val[r]=mn[j][i];pos[r]=j;r++;
if(pos[l]==j-n) l++;
if(j>=n) y[j]=val[l];
}
for(int i=n;i<=a;i++) ans=min(ans,x[i]-y[i]);
}
printf("%d\n",ans);
return ;
}
1047: [HAOI2007]理想的正方形的更多相关文章
- bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp
题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2369 Solved: 1266[Submi ...
- BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )
单调队列..先对每一行扫一次维护以每个点(x, y)为结尾的长度为n的最大最小值.然后再对每一列扫一次, 在之前的基础上维护(x, y)为结尾的长度为n的最大最小值. 时间复杂度O(ab) (话说还是 ...
- [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】
题目链接:BZOJ - 1047 题目分析 使用单调队列在 O(n^2) 的时间内求出每个 n * n 正方形的最大值,最小值.然后就可以直接统计答案了. 横向有 a 个单调队列(代码中是 Q[1] ...
- 1047: [HAOI2007]理想的正方形 - BZOJ
Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小.Input 第一行为3个整数,分别表示a,b,n的值第二行至第a ...
- 【BZOJ】1047: [HAOI2007]理想的正方形(单调队列/~二维rmq+树状数组套树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 树状数组套树状数组真心没用QAQ....首先它不能修改..而不修改的可以用单调队列做掉,而且更 ...
- BZOJ 1047: [HAOI2007]理想的正方形
题目 单调队列是个很神奇的东西,我以前在博客写过(吧) 我很佩服rank里那些排前几的大神,700ms做了时限10s的题,简直不能忍.(但是我还是不会写 我大概一年半没写单调队列,也有可能根本没有写过 ...
- BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞
题意很简明吧? 枚举的矩形下边界和右端点即右下角,来确定矩形位置: 每一个纵列开一个单调队列,记录从 i-n+1 行到 i 行每列的最大值和最小值,矩形下边界向下推移的时候维护一下: 然后在记录的每一 ...
- bzoj 1047: [HAOI2007]理想的正方形【单调队列】
没有复杂结构甚至不长但是写起来就很想死的代码类型 原理非常简单,就是用先用单调队列处理出mn1[i][j]表示i行的j到j+k-1列的最小值,mx1[i][j]表示i行的j到j+k-1列的最大值 然后 ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
随机推荐
- springMVC form表单提交多个对象集合--使用ajax提交--前台json格式数据封装方法
(function ($) { $.fn.serializeJson = function () { var jsonData1 = {}; var serializeArray = this.ser ...
- 使用spring boot admin
spring boot admin管理端, 需要部署成独立的应用 pom中添加依赖 <dependency> <groupId>de.codecentric</group ...
- VALID_FOR in db standby
检查DG 装填: 目标主机检查mrp是否正常: SELECT PROCESS FROM V$MANAGED_STANDBY WHERE PROCESS LIKE 'MRP%';--若mrp没有启动,则 ...
- OpenStack Weekly Rank 2015.07.20
Module Reviews Drafted Blueprints Completed Blueprints Filed Bugs Resolved Bugs Cinder 8 1 3 9 10 Sw ...
- list map set常用方法之list
list 常用方法: 默认添加:list.add(e); 指定下标添加(添加后下标后的元素向后挪一位):list.add(index,e); 获得集合内元素个数:list.size(); 返回是否删除 ...
- SpringBoot | 第二十一章:异步开发之异步调用
前言 上一章节,我们知道了如何进行异步请求的处理.除了异步请求,一般上我们用的比较多的应该是异步调用.通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的.比如记录日志信息等业务.这个时候 ...
- npm安装使用淘宝代理的方法(设置registry参数)
公司防火墙问题导致 npm下载失败,安装使用cnpm不知道什么原因抽筋, 还有一个简单的办法,就是npm安装模块时,设置代理: npm install -g vue-cli --registry=ht ...
- mockjs模拟数据请求
一般项目的方法 <html> <head> <script> <script src="http://requirejs.org/docs/rele ...
- form表单多文件上传
1.html/jsp主页 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- RING0到RING3
在前一篇文章里面,我们将了CPU保护模式中的几种特权RING0,RING1,RING2,RING3!操作系统通常运行在RING0,应用程序通常运行在RING3. CPU如何从RING0到RING3 先 ...