http://www.spoj.com/problems/MINSUB/en/

题意:给出一个n*m的矩阵M,和一个面积k,要使得M的子矩阵M'的最小元素最大并且面积大于等于k,问子矩阵M'的最小元素最大能是多少,并且求出最大的面积。

思路:二分一个最小元素x,转化为判断矩阵M里面是否存在一个子矩阵使得这个子矩阵的面积大于等于k并且所有元素都大于x。

用另一个矩阵,1表示该位置的元素大于等于x,0表示元素小于x。

转化为判断是否存在一个子矩阵元素为1的面积大于等于k。

这样可以用到早上学习的单调栈,去维护最大的子矩阵面积。

像这样,求出最大的矩阵面积。

如果矩阵面积大于等于k,那么就去找是否有更大的x去满足题意。

 #include <bits/stdc++.h>
using namespace std;
#define N 1010
struct node {
int pre, suf, val;
} p[N];
int mat[N][N], mp[N][N], h[N][N], n, m, k, square; bool check(int x) {
memset(mp, , sizeof(mp));
memset(h, , sizeof(h));
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++) if(mat[i][j] >= x) mp[i][j] = ;
square = ;
for(int i = ; i <= n; i++) {
stack<node> sta;
for(int j = ; j <= m; j++) {
if(mp[i][j]) h[i][j] = h[i-][j] + ;
p[j] = (node) {, , h[i][j]};
}
sta.push(p[]);
for(int j = ; j <= m; j++) {
while(!sta.empty() && sta.top().val > p[j].val) {
node top = sta.top(); sta.pop();
if(!sta.empty()) sta.top().suf += top.suf;
p[j].pre += top.pre;
square = max(square, (top.suf + top.pre - ) * top.val);
}
sta.push(p[j]);
}
while(!sta.empty()) {
node top = sta.top(); sta.pop();
if(!sta.empty()) sta.top().suf += top.suf;
square = max(square, (top.suf + top.pre - ) * top.val);
}
}
if(square >= k) return true;
return false;
} void solve() {
int t;
scanf("%d", &t);
while(t--) {
scanf("%d%d%d", &n, &m, &k);
int r = , l = , ans;
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
scanf("%lld", &mat[i][j]);
if(mat[i][j] < l) l = mat[i][j];
if(mat[i][j] > r) r = mat[i][j];
}
}
ans = l;
while(l <= r) {
int mid = (l + r) >> ;
if(check(mid)) l = mid + , ans = mid;
else r = mid - ;
}
check(ans);
printf("%d %d\n", ans, square);
}
} int main() {
solve();
return ;
}

SPOJ MINSUB - Largest Submatrix(二分+单调栈)的更多相关文章

  1. MINSUB - Largest Submatrix

    MINSUB - Largest Submatrix no tags  You are given an matrix M (consisting of nonnegative integers) a ...

  2. BZOJ 1012--[JSOI2008]最大数maxnumber(二分&单调栈)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 14142  Solved: 6049[Subm ...

  3. Gym 100971D Laying Cables 二分 || 单调栈

    要求找出每个a[i],找到离他最近而且权值比它大的点,若距离相同,输出权利最大的那个 我的做法有点复杂,时间也要500+ms,因为只要时间花在了map上. 具体思路是模拟一颗树的建立过程,对于权值最大 ...

  4. 51Nod 1279:扔盘子(二分||单调栈)

    1279 扔盘子 1.0 秒 131,072.0 KB 5 分 1级题 有一口井,井的高度为N,每隔1个单位它的宽度有变化.现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住( ...

  5. spoj MINSUB 单调栈+二分

    题目链接:点击传送 MINSUB - Largest Submatrix no tags  You are given an matrix M (consisting of nonnegative i ...

  6. POJ-3494 Largest Submatrix of All 1’s (单调栈)

    Largest Submatrix of All 1’s Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 8551   Ac ...

  7. Largest Submatrix of All 1’s(思维+单调栈)

    Given a m-by-n (0,1)-matrix, of all its submatrices of all 1's which is the largest? By largest we m ...

  8. POJ 3494 Largest Submatrix of All 1’s 单调队列||单调栈

    POJ 3494 Largest Submatrix of All 1’s Description Given a m-by-n (0,1)-matrix, of all its submatrice ...

  9. HDU 2870 Largest Submatrix (单调栈)

    http://acm.hdu.edu.cn/showproblem.php? pid=2870 Largest Submatrix Time Limit: 2000/1000 MS (Java/Oth ...

随机推荐

  1. 带参跳转其他controller

    public class GoToOtherController : Controller { public ActionResult Index() { var vm = new GetValueF ...

  2. XF 通过判断平台加载不同的图片

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. 隐藏在QRCode二维码背后的秘密

    原文:隐藏在QRCode二维码背后的秘密 隐藏在QRCode二维码背后的秘密,您知道吗? 1.容错级. 二维码的容错级分别为:L,M,Q和H.其中,L最低,H最高.如何从二维码中一眼看出其容错级别呢? ...

  4. .Net中使用数据库(sqlite)的大体流程(简单向)

    说来数据库,各种语言各种数据库在操作上大体无异,基本都是连接数据库.操作数据库.关闭数据库连接的流程,不过Sqlite由于是单文件数据库,相比其他服务器的数据库连接更简单,只需要给定数据库文件的路径即 ...

  5. 完美实现鼠标拖拽事件,解决各种小bug,基于jquery

    鼠标拖拽事件是web中使用频率极高的事件,之前写过的代码包括网上的代码,总存在各种各样的问题,包括拖拽体验差,松开鼠标后拖拽效果仍存在以及代码冗余过大等 本次我才用jQuery实现一个尽可能高效的拖拽 ...

  6. Win8 Metro(C#)数字图像处理--2.62图像对数增强

    原文:Win8 Metro(C#)数字图像处理--2.62图像对数增强  [函数名称]   对数增强      WriteableBitmap LogenhanceProcess(Writeabl ...

  7. block-chain java source

    source:github.com/enderlu/Swiftglobal ide:idea ,要安装Lombok plugin 配置: -Dspring.config.location=file:D ...

  8. WPF使用AForge实现Webcam预览(一)

    本文简略地介绍一下如果使用AForge来实现前置/后置摄像头的预览功能. 要使用AForge,就需要添加AForge NuGet相关包的引用,这些包依赖的其他包会自动安装. AForge.Contro ...

  9. 以太坊(ethereum)开发DApp应用的入门区块链技术教程

    概述 对初学者,首先要了解以太坊开发相关的基本概念.   学习以太坊开发的一般前序知识要求,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ruby,Java... 前 ...

  10. Linux之mysql安装

    查看文件内容的命令有很多:cat, tac, more, less, head, tail, nl. cat由第一行开始显示档案内容:tac从最后一行开始显示,可以看出tac是cat的倒着写:more ...