bzoj1047 理想的正方形
Description
有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
Input
第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。
Output
仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。
水平方向用单调队列扫一次得出所有1*n区域的最大值和最小值
竖直方向再用单调队列扫一次上一部记录的最大值和最小值得出所有n*n区域的最大值和最小值
时间复杂度O(n2)
#include<cstdio>
int a,b,n,v[][];
int mx1[][],mn1[][];
int mx2[][],mn2[][];
struct{
int q[],qt[];
int qs,qe;
void clear(){
qs=qe=;
}
void push(int x,int t){
while(qs<qe&&q[qe-]<=x)--qe;
qt[qe]=t;
q[qe++]=x;
}
void chk(int p){
while(qs<qe&&qt[qs]<=p)qs++;
}
int max(){
return q[qs];
}
}q1;
struct{
int q[],qt[];
int qs,qe;
void clear(){
qs=qe=;
}
void push(int x,int t){
while(qs<qe&&q[qe-]>=x)--qe;
qt[qe]=t;
q[qe++]=x;
}
void chk(int p){
while(qs<qe&&qt[qs]<=p)qs++;
}
int min(){
return q[qs];
}
}q2;
int main(){
scanf("%d%d%d",&a,&b,&n);
for(int i=;i<a;i++)
for(int j=;j<b;j++)scanf("%d",v[i]+j);
for(int i=;i<a;i++){
q1.clear();
q2.clear();
for(int j=;j<n;j++)q1.push(v[i][j],j),q2.push(v[i][j],j);
mx1[i][n-]=q1.max();
mn1[i][n-]=q2.min();
for(int j=n;j<b;j++){
q1.push(v[i][j],j);
q1.chk(j-n);
mx1[i][j]=q1.max();
q2.push(v[i][j],j);
q2.chk(j-n);
mn1[i][j]=q2.min();
}
}
for(int j=;j<b;j++){
q1.clear();
q2.clear();
for(int i=;i<n;i++)q1.push(mx1[i][j],i),q2.push(mn1[i][j],i);
mx2[n-][j]=q1.max();
mn2[n-][j]=q2.min();
for(int i=n;i<a;i++){
q1.push(mx1[i][j],i);
q1.chk(i-n);
mx2[i][j]=q1.max();
q2.push(mn1[i][j],i);
q2.chk(i-n);
mn2[i][j]=q2.min();
}
}
int minv=;
for(int i=n-;i<a;i++){
for(int j=n-;j<b;j++){
if(mx2[i][j]-mn2[i][j]<minv)minv=mx2[i][j]-mn2[i][j];
}
}
printf("%d",minv);
return ;
}
bzoj1047 理想的正方形的更多相关文章
- bzoj1047理想的正方形
题目链接 纪念又双叒叕的一道暴力碾标算的题 我们考虑纯暴力 #include<iostream> #include<cstdio> #include<algorithm& ...
- 【bzoj1047】理想的正方形
[bzoj1047]理想的正方形 题意 给定\(a*b\)由整数组成的矩形. 现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值 的差最小. \(1\leq a,b\leq 10 ...
- 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)
[BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n ...
- 【BZOJ1047】[HAOI2007]理想的正方形
[BZOJ1047][HAOI2007]理想的正方形 题面 bzoj 洛谷 题解 二维\(st\)表,代码是以前的 #include<iostream> #include<cstdi ...
- [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列
理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...
- 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]理想的正方形 (倍增ST表)
[HAOI2007]理想的正方形 题目描述 有一个\(a*b\)的整数组成的矩阵,现请你从中找出一个\(n*n\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: ...
- HAOI2007 理想的正方形
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1402 Solved: 738[Submit][Sta ...
随机推荐
- 快速切题 cf118A
这教导人们一定要看题,要看题,元音包含了‘y’,完毕,要看题啊 #include <cstring> #include <cstdio> #include <cctype ...
- FR报表 FileName
在设计或者打印预览时,如果设置了FileName,可能反而出错. procedure TfrxReport.ShowPreparedReport; var WndExStyles: Integer; ...
- java.util.logging
我们目前记录日志用的最多的就是Apache的log4j,其实java.util本身也提供日志记录功能,即java.util.logging,值得关注的就是它的等级与log4j的等级有所不同: 首先我们 ...
- Python学习(006)-深浅拷贝及集合
深浅拷贝 import copy husband=['xiaoxin',123,[200000,100000]] wife=husband.copy() #浅拷贝 wife[0]='xiaohong ...
- Python 字典的遍历
dic = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟" ...
- WebGL编程指南高级技术篇(常见需求的处理)
一.鼠标控制模型旋转 实质的根据鼠标移动前后的位置比较得出x,y轴的旋转角度: 图中是一个屏幕,有一个模型(恩,他是一个模型),鼠标由P点移动到P1点,我们假定移动单位步长旋转β角度: P(x1,y1 ...
- Tensorflow 解决MNIST问题的重构程序
分为三个文件:mnist_inference.py:定义前向传播的过程以及神经网络中的参数,抽象成为一个独立的库函数:mnist_train.py:定义神经网络的训练过程,在此过程中,每个一段时间保存 ...
- 在intent-filter中的配置
1.scheme约束和mimetype的数据类型,这些都可以自己去定义. 2.但是由于在MainActivity却不能直接将这两个参数分开来写,例如setdata和settype,这样会互相删除. 因 ...
- android中的5大布局
1.线性布局:LinearLayout layout_margin 上下左右的距离分别为 下面图中的orientation表示的是布局中的方向 分别有horizontal表示水平 vertic ...
- [LeetCode&Python] Problem 821. Shortest Distance to a Character
Given a string S and a character C, return an array of integers representing the shortest distance f ...