1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2857  Solved: 1560[Submit][Status][Discuss] Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. Input 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数.每行相邻两数之间…
题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2369  Solved: 1266[Submit][Status][Discuss] Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. Input 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数.每行相…
单调队列..先对每一行扫一次维护以每个点(x, y)为结尾的长度为n的最大最小值.然后再对每一列扫一次, 在之前的基础上维护(x, y)为结尾的长度为n的最大最小值. 时间复杂度O(ab) (话说还是deque2048ms快..list3572ms慢死了) #include<bits/stdc++.h> using namespace std; const int maxn = 1009; int X[maxn][maxn], R, C, N; int MN[maxn][maxn], MX[m…
题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入格式 第一行为3个整数,分别表示a,b,n的值 第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数.每行相邻两数之间用一空格分隔. 输出格式 仅一个整数,为 \(a\times b\)矩阵中所有" \(n\times n\)正方形区域中的最大整数和最小整数的差…
Solution 二维单调队列, 这个数组套起来看得我眼瞎... Code #include<cstdio> #include<algorithm> #include<cstring> #define rd read() #define rep(i,a,b) for(register int i = (a); i <= (b); ++i) #define per(i,a,b) for(register int i = (a); i >= (b); --i)…
题意很简明吧? 枚举的矩形下边界和右端点即右下角,来确定矩形位置: 每一个纵列开一个单调队列,记录从 i-n+1 行到 i 行每列的最大值和最小值,矩形下边界向下推移的时候维护一下: 然后在记录的每一列的最大值和最小值上,跑滑动窗口,即用单调队列维护区间 [ j-n+1 , j ] 的最大值和最小值: 相当于维护了一个矩形的最大值和最小值 #include<cstdio> #include<iostream> #include<queue> #define R regi…
题目链接 Solution MD,经过这道题,算是掌握单调队列了... 可以先预处理出点 \((i,j)\) 往上 \(n\) 的最大值和最小值. 然后再横着做一遍单调队列即可. Code #include<bits/stdc++.h> #define in(x) x=read(); #define ll long long #define N 1001 using namespace std; ll read() { char ch=getchar(); ll f=1,w=0; while(…
洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一列求出长度为n的前面算出来的最大值的最大值,前面算出来的最小值的最小值.如果直接做是n的三次方,但是用单调队列优化后就是n方的. #include <algorithm> #include <iterator> #include <iostream> #include &l…
Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; #define maxn 1002 #define ll long long #define inf 100000000000 int minv[maxn][maxn], maxv[maxn][maxn]; struct Node{ ll val; int pos; Node(ll val=0,int pos=0…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1047 题意:给出一个n*m的矩阵.在所有K*K的子矩阵中,最大最小差值最小的是多少? 思路:枚举每一行,枚举每一列,(r,c),将(r-K+1,c-K+1)中的数字插入到单调队列中保存(这里设置两个单调队列,一个最大一个最小).每次计算以(r,c)为右下角的子矩阵的值时,判断队列头元素的列数是不是大于等于c-K+1,否则删掉队头.插入时,比如维护最小的单调队列,要判断队尾的元素是不是小…