BZOJ 1047: [HAOI2007]理想的正方形
题目
单调队列是个很神奇的东西,我以前在博客写过(吧)
我很佩服rank里那些排前几的大神,700ms做了时限10s的题,简直不能忍。(但是我还是不会写
我大概一年半没写单调队列,也有可能根本没有写过
放两个程序,第一个TLE,第二个3s+直接通过
哦对了!单调队列的复杂度为O(n),很经典的证明呢
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXab=1000+7,MAXn=100+7,inf=2147483647;
typedef int MATRIX[MAXn][MAXab][MAXab];
MATRIX fmin,fmax;
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a>b?b:a;}
inline int min4(int a,int b,int c,int d){return min(min(min(a,b),c),d);}
inline int max4(int a,int b,int c,int d){return max(max(max(a,b),c),d);}
int main(){
//freopen("b1047.in","r",stdin);
int a,b,n;
scanf("%d%d%d",&a,&b,&n);
for (int i=1;i<=a;i++)
for (int j=1;j<=b;j++) {
scanf("%d",&fmin[1][i][j]);
fmax[1][i][j]=fmin[1][i][j];
}
int ans=inf;
for (int k=2;k<=n;k++){ //kは决策です!
for (int i=1;i<=a-k+1;i++)
for (int j=1;j<=b-k+1;j++){
fmin[k][i][j]=
min4(fmin[k-1][i][j],fmin[k-1][i+1][j],
fmin[k-1][i][j+1],fmin[k-1][i+1][j+1]);
fmax[k][i][j]=
max4(fmax[k-1][i][j],fmax[k-1][i+1][j],
fmax[k-1][i][j+1],fmax[k-1][i+1][j+1]);
if (k==n) ans=min(fmax[k][i][j]-fmin[k][i][j],ans);
}
}
printf("%d",ans);
return 0;
}
/*优先队列!*/
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXn=100+7,MAXab=1000+7;
const int inf=0x7fffffff;
int n,a,b,fmin[MAXab][MAXab],fmax[MAXab][MAXab];
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
int main(){
// freopen("b1047.in","r",stdin);
// freopen("b1047.out","w",stdout);
scanf("%d%d%d",&a,&b,&n);
for (int i=1;i<=a;i++){
int ts,ws,tb,wb,qs[MAXab]={0},qb[MAXab]={-inf},v[MAXab]={0};
ts=ws=tb=wb=1;
for (int j=1;j<=b;j++){
scanf("%d",&v[j]);
while (ws-->ts&&v[j]<v[qs[ws]]);ws++;qs[ws++]=j;
if (qs[ws-1]-qs[ts]+1>n) ts++;
while (wb-->tb&&v[j]>v[qb[wb]]);wb++;qb[wb++]=j;
if (qb[wb-1]-qb[tb]+1>n) tb++;
if (j>=n) fmin[i][j-n+1]=v[qs[ts]],fmax[i][j-n+1]=v[qb[tb]];
}
}
int ans=inf;
for (int i=1;i<=a-n+1;i++){
for (int j=1;j<=b-n+1;j++){
int minans=inf,maxans=-inf;
for (int k=0;k<n;k++){
minans=min(minans,fmin[i+k][j]);
maxans=max(maxans,fmax[i+k][j]);
}
ans=min(ans,maxans-minans);
}
}
cout<<ans<<endl;
return 0;
}
BZOJ 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] ...
- 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列的最大值 然后 ...
- [bzoj 1047][HAOI2007]理想正方形(单调队列)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 分析: 第一感觉二维线段树当然没问题但是挺慢的. 注意到要求的正方形形中的最大最小边长是 ...
- 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 1407 [HAOI2007]理想的正方形
[题意] 给定一个n*m的矩阵,求所有大小为k*k的正方形中(最大值-最小值)的最小值 [思路] 先横着算出每一行的长度为k的窗口内的最大值,变成一个n*(m-k+1)的矩阵mx 再竖着算出每一列的长 ...
随机推荐
- Math DayTwo
(1)Excel Sheet Column Number 解题思路:将26进制的数转化为10进制 代码如下: public class Solution { public int titleToNum ...
- oracle 空间大小查询
一.表空间大小 select b.file_name 物理文件名, b.tablespace_name 表空间, b.bytes / 1024 / 1024 大小M, (b.bytes - sum(n ...
- SqlServer删除登录账户
MSSM中登录账户无法删除的解决方法 资源管理器中选中C盘,输入SqlStudio.bin查询文件 右击点击"打开该文件位置",找到该文件删除即可.
- Android Runtime
[Android Runtime] Every Android application runs in its own process, with its own instance of the Da ...
- Linux基础-目录结构
/:根目录 /bin:存放可执行程序(二进制文件) /etc:存放系统或者用户安装的软件所用的一些配置文件 /lib:操作系统运行时候使用的一些基本动态库 /media:自动挂载外设,会将外设挂载到该 ...
- [Android基础论]为何Activity退出之后,系统没有调用onDestroy方法?
首先,问题是如何出现的? 晚上复查代码,发现一个activity没有调用自己的ondestroy方法 我表示非常的费解,于是我检查了下代码. 发现再finish代码之后接了如下代码 finish(); ...
- C#多线程实现方法
C#中实现线程应用开发的类都包含在了System.Threading命名空间中,比较常用的是Thread,ThreadPool类 Thread类构造函数作用是创建线程,有两个重载版本,一个带参数,一个 ...
- HR常用事务代码
HR TCODE 描述 PA30 维护人力资源主数据 PA40 人事活动
- JavaScript基础认知
此文只适用于初学者,大神们就不要看了,嘿嘿~ 一.定义变量 关键字 var,由此关键字定义变量,例如:var a =21:就把21这个数定义给了变量a 二.基本数据类型 1.Number类型 表示数字 ...
- jQuery Mobile 网格布局
jQuery Mobile 布局网格 jQuery Mobile 提供了一套基于 CSS 的列布局方案.不过,一般不推荐在移动设备上使用列布局,这是由于移动设备的屏幕宽度所限. 但是有时你需要定位更小 ...