SPOJ MINSUB - Largest Submatrix(二分+单调栈)
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(二分+单调栈)的更多相关文章
- MINSUB - Largest Submatrix
MINSUB - Largest Submatrix no tags You are given an matrix M (consisting of nonnegative integers) a ...
- BZOJ 1012--[JSOI2008]最大数maxnumber(二分&单调栈)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 14142 Solved: 6049[Subm ...
- Gym 100971D Laying Cables 二分 || 单调栈
要求找出每个a[i],找到离他最近而且权值比它大的点,若距离相同,输出权利最大的那个 我的做法有点复杂,时间也要500+ms,因为只要时间花在了map上. 具体思路是模拟一颗树的建立过程,对于权值最大 ...
- 51Nod 1279:扔盘子(二分||单调栈)
1279 扔盘子 1.0 秒 131,072.0 KB 5 分 1级题 有一口井,井的高度为N,每隔1个单位它的宽度有变化.现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住( ...
- spoj MINSUB 单调栈+二分
题目链接:点击传送 MINSUB - Largest Submatrix no tags You are given an matrix M (consisting of nonnegative i ...
- POJ-3494 Largest Submatrix of All 1’s (单调栈)
Largest Submatrix of All 1’s Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 8551 Ac ...
- 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 ...
- 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 ...
- HDU 2870 Largest Submatrix (单调栈)
http://acm.hdu.edu.cn/showproblem.php? pid=2870 Largest Submatrix Time Limit: 2000/1000 MS (Java/Oth ...
随机推荐
- Linux 系统安装(5分钟)
安装版本:CentOS 6.5 minimal 虚拟机工具:VMware 虚拟机配置:1核2线程 2G内存 50G硬盘 步骤: 一.虚拟机配置 1.打开VMware,创建新的虚拟机,选择典型安装: 2 ...
- ASP .NET DropDownList多级联动事件
思路 假如有三级省.市.区,先加载出所有省选择省之后,加载出该省所有市选择市之后,加载出该市所有区重新选择省,则清空市和区重新选择市,则清空区想好数据结构,不同的数据结构做法不同 例子 数据结构 pu ...
- 读BeautifulSoup官方文档之html树的修改
修改html树无非是对其中标签的改动, 改动标签的名字(也就是类型), 属性和标签里的内容... 先讲这边提供了很方便的方法来对其进行改动... soup = BeautifulSoup('<b ...
- jquery 鼠标经过延时触发事件,jquery插件
jquery 鼠标经过延时触发事件. 用来做:鼠标经过选项卡,延时切换,鼠标经过商城分类延时显示,最好不过,防止用户随便滑动就切换了选项卡. 一.引入jq 二.加入以下插件代码 /* * 鼠标经过延时 ...
- vs2015 cordova环境安装【个人遇到的几个问题】
原文:vs2015 cordova环境安装[个人遇到的几个问题] 问题1: vs2015,设置 Debug Android 设备[真机调试] Exception in thread "m ...
- 【Git】生成Patch和使用Patch
1.生成Patch(俗称快照) 先来看看repo manifest 的用法 <1>cd /工作目录/项目目录/.repo/manifests <2>repo manifest ...
- Android疑难杂症之Theme
背景:最近在把自己之前写的一个应用换成Material Design风格,在看官方Guide后动手试了一试,没想到出门就遇到了坑,在换成Material Design风格的主题后,我设置了一下colo ...
- lvcreate命令
lvcreate Command Examples on Linux : 1. The following command creates a logical volume 15 gigabytes ...
- Linux下的wfopen(手工打造)
Of Linux on wfopen (open wide-character version of the file name and mode) to achieve Not directly a ...
- Long Shadows Generate是一款在线使用纯CSS3实现长阴影的效果,一款强大的扁平化长投影制造器。
Long Shadows Generate是一款在线使用纯CSS3实现长阴影的效果,一款强大的扁平化长投影制造器. Long Shadows Generate 彩蛋爆料直击现场 Long Shadow ...