【HAOI 2007】 理想的正方形
【题目链接】
【算法】
单调队列
【代码】
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1010
const int INF = 2e9; int i,j,a,b,n,ans = INF;
deque<int> q1,q2;
int val[MAXN][MAXN],mx[MAXN][MAXN],mn[MAXN][MAXN]; template <typename T> inline void read(T &x)
{
int f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
template <typename T> inline void write(T x)
{
if (x < )
{
putchar('-');
x = -x;
}
if (x > ) write(x/);
putchar(x%+'');
}
template <typename T> inline void writeln(T x)
{
write(x);
puts("");
} int main() { read(a); read(b); read(n);
for (i = ; i <= a; i++)
{
for (j = ; j <= b; j++)
{
read(val[i][j]);
}
}
for (i = ; i <= b; i++)
{
q1.clear(); q2.clear();
for (j = ; j < n; j++)
{
while ((!q1.empty()) && (val[q1.back()][i] <= val[j][i])) q1.pop_back();
q1.push_back(j);
while ((!q2.empty()) && (val[q2.back()][i] >= val[j][i])) q2.pop_back();
q2.push_back(j);
}
for (j = n; j <= a; j++)
{
while ((!q1.empty()) && (j - q1.front() >= n)) q1.pop_front();
while ((!q2.empty()) && (j - q2.front() >= n)) q2.pop_front();
while ((!q1.empty()) && (val[q1.back()][i] <= val[j][i])) q1.pop_back();
q1.push_back(j);
while ((!q2.empty()) && (val[q2.back()][i] >= val[j][i])) q2.pop_back();
q2.push_back(j);
mx[j][i] = val[q1.front()][i];
mn[j][i] = val[q2.front()][i];
}
}
for (i = n; i <= a; i++)
{
q1.clear(); q2.clear();
for (j = ; j < n; j++)
{
while ((!q1.empty()) && (mx[i][q1.back()] <= mx[i][j])) q1.pop_back();
q1.push_back(j);
while ((!q2.empty()) && (mn[i][q2.back()] >= mn[i][j])) q2.pop_back();
q2.push_back(j);
}
for (j = n; j <= b; j++)
{
while ((!q1.empty()) && (j - q1.front() >= n)) q1.pop_front();
while ((!q2.empty()) && (j - q2.front() >= n)) q2.pop_front();
while ((!q1.empty()) && (mx[i][q1.back()] <= mx[i][j])) q1.pop_back();
q1.push_back(j);
while ((!q2.empty()) && (mn[i][q2.back()] >= mn[i][j])) q2.pop_back();
q2.push_back(j);
ans = min(ans,mx[i][q1.front()]-mn[i][q2.front()]);
}
}
writeln(ans); return ; }
【HAOI 2007】 理想的正方形的更多相关文章
- [HAOI 2007]理想的正方形
Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. Input 第一行为3个整数,分别表示a,b,n的值第二行至第 ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- 【bzoj1047】理想的正方形
[bzoj1047]理想的正方形 题意 给定\(a*b\)由整数组成的矩形. 现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值 的差最小. \(1\leq a,b\leq 10 ...
- HAOI2007 理想的正方形
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1402 Solved: 738[Submit][Sta ...
- RAM——[HAOI2007]理想的正方形
题目:[HAOI2007]理想的正方形 描述: [问题描述] 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [输入]: 第一行为3个 ...
- 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) (话说还是 ...
- 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)
[BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n ...
- bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...
- 【BZOJ1047】[HAOI2007]理想的正方形
[BZOJ1047][HAOI2007]理想的正方形 题面 bzoj 洛谷 题解 二维\(st\)表,代码是以前的 #include<iostream> #include<cstdi ...
随机推荐
- 18Spring后置通知
Spring后置通知,和前置通知类似,直接看代码: package com.cn.spring.aop.impl; //加减乘除的接口类 public interface ArithmeticCalc ...
- 爬虫框架urllib 之(二) --- urllib基础
urllib 官方文档:https://docs.python.org/zh-cn/3/library/urllib.html urllib介绍 Urllib是python内置的HTTP请求库,是py ...
- BNUOJ 7178 病毒侵袭持续中
病毒侵袭持续中 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 30 ...
- IIS 和 ASP.NET ISAPI
前几天有一个朋友在MSN上问我“ASP.NET 从最初的接收到Http request到最终生成Response的整个流程到底是怎样的?”我觉得这个问题涉及到IIS和ASP.NETASP.NET Ru ...
- 转盘抽奖 canvas & 抽奖 H5 源码
转盘抽奖 canvas https://github.com/givebest/wechat-turntalbe-canvas https://blog.givebest.cn/GB-canvas-t ...
- noip模拟赛 道路分组
分析:因为每一组编号都是连续的嘛,所以能分成一组的尽量分,每次加边后dfs判断一下1和n是否连通.有向图的判连通没有什么很快的方法,特别注意,并查集是错的!这个算法可以得到60分. 事实上每一次都不需 ...
- 【NOIP2017练习】论战大原题(并查集)
题意:给定一个n个点m条边的无向图.定义一条路径的长度为路径上最小边的权值. 定义dist(i,j)为起点为i,终点为j的长度最长的路径的长度.求出第k大的dist(i,j)(i<j). 对于所 ...
- 【BZOJ4403】序列统计(Lucas定理,组合计数)
题意:给定三个正整数N.L和R, 统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量. 输出答案对10^6+3取模的结果. 对于100%的数据,1≤N,L,R≤10^9,1≤T≤100, ...
- Nginx配置文件nginx.conf 详解
#定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debu ...
- POJ 2456_Aggressive cows
题意: 给定N个位置,把C头牛分别放入,求相邻两头牛的最大距离. 分析: 即为求两头牛之间最小距离的最大值.二分搜索答案. 代码: #include<iostream> #include& ...