BZOJ 1047 理想的正方形(单调队列)
题目链接: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,否则删掉队头。插入时,比如维护最小的单调队列,要判断队尾的元素是不是小于当前元素,不小于则删掉队尾。
int n,m,K;
pair<int,int> Q1[N],Q2[N];
int head1,tail1,head2,tail2;
int c[N][N];
pair<int,int> get(int r1,int r2,int t)
{
int Min=INF,Max=-INF,i;
FOR(i,r1,r2)
{
Min=min(Min,c[i][t]);
Max=max(Max,c[i][t]);
}
return MP(Min,Max);
}
int cal(int r)
{
head1=tail1=head2=tail2=0;
int i,x,y,ans=INF;
pair<int,int> p;
for(i=1;i<=m;i++)
{
p=get(r-K+1,r,i);
x=p.first;
y=p.second;
while(head1<tail1&&Q1[tail1-1].second>=x) tail1--;
Q1[tail1++]=MP(i,x);
while(head2<tail2&&Q2[tail2-1].second<=y) tail2--;
Q2[tail2++]=MP(i,y);
if(i<K) continue;
while(Q1[head1].first<i-K+1) head1++;
x=Q1[head1].second;
while(Q2[head2].first<i-K+1) head2++;
y=Q2[head2].second;
if(y-x<ans) ans=y-x;
}
return ans;
}
int main()
{
RD(n,m,K);
int i,j;
FOR1(i,n) FOR1(j,m) RD(c[i][j]);
int ans=INF,temp;
for(i=K;i<=n;i++)
{
temp=cal(i);
if(temp<ans) ans=temp;
}
PR(ans);
return 0;
}
BZOJ 1047 理想的正方形(单调队列)的更多相关文章
- 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]理想的正方形 单调队列瞎搞
题意很简明吧? 枚举的矩形下边界和右端点即右下角,来确定矩形位置: 每一个纵列开一个单调队列,记录从 i-n+1 行到 i 行每列的最大值和最小值,矩形下边界向下推移的时候维护一下: 然后在记录的每一 ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- P2216 [HAOI2007]理想的正方形 (单调队列)
题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...
- [BZOJ]1047 理想的正方形(HAOI2007)
真·水题.小C本来是不想贴出来的,但是有一股来自东方的神秘力量催促小C发出来. Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和 ...
- BZOJ 1047 理想的正方形
单调队列的基本应用. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...
- bzoj1047/luogu2216 理想的正方形 (单调队列)
开b组单调队列,分别维护此时某一列中的最大/最小值 然后我每次把它们的头取出来,塞到维护行的单调队列里,就是n*n的最大/最小值 #include<bits/stdc++.h> #defi ...
- luogu 2216 理想的正方形 单调队列(其实没有DP)
#include<bits/stdc++.h> using namespace std; ; ; int a,b,n; int g[A][A],q[A][N],Q[A][N]; int h ...
随机推荐
- bzoj 1041 圆上的整点 分类: Brush Mode 2014-11-11 20:15 80人阅读 评论(0) 收藏
这里先只考虑x,y都大于0的情况 如果x^2+y^2=r^2,则(r-x)(r+x)=y*y 令d=gcd(r-x,r+x),r-x=d*u^2,r+x=d*v^2,显然有gcd(u,v)=1且u&l ...
- setrendertraget 上下颠倒
这个问题遇到两次了 之前一次是粒子rendertotexture 没设viewprot的时候是上下颠倒的 设置viewport之后就好了 现在在一个setrendertarget的地方又遇到了 上下颠 ...
- Mrt render
mutil render target Pixel shder输出一个结构体 Out.f4Color Out.f4Normal 这步在渲染物体的shader里 在application setcolo ...
- javascript设计模式-迭代器模式(Iterator)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Http Url Get请求方式需要对中文参数进行编码
public static void main(String[] args) { try { String mytext = java.net.URLEncoder.encode("上海南站 ...
- codeforces 439C Devu and Partitioning of the Array(烦死人的多情况的模拟)
题目 //这是一道有n多情况的烦死人的让我错了n遍的模拟题 #include<iostream> #include<algorithm> #include<stdio.h ...
- POJ 1236
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10500 Accepted: 41 ...
- java 静态构造函数
在java中貌似是没有静态构造函数的. 不过用下面的方式同样可以实现效果. static { }//end 这是静态代码块
- 为什么toString方法可以用来区分数组和对象?
首先大家都应该知道在javascript中只有是对象都存在toString方法,将调用该方法的值转换为字符串返回,如下: var arr = [1, 2, 3]; console.log(arr.to ...
- API 版本控制
http://www.oschina.net/translate/introduction-to-web-api-versioning