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去满足题意。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define N 1010
  4. struct node {
  5. int pre, suf, val;
  6. } p[N];
  7. int mat[N][N], mp[N][N], h[N][N], n, m, k, square;
  8.  
  9. bool check(int x) {
  10. memset(mp, , sizeof(mp));
  11. memset(h, , sizeof(h));
  12. for(int i = ; i <= n; i++)
  13. for(int j = ; j <= m; j++) if(mat[i][j] >= x) mp[i][j] = ;
  14. square = ;
  15. for(int i = ; i <= n; i++) {
  16. stack<node> sta;
  17. for(int j = ; j <= m; j++) {
  18. if(mp[i][j]) h[i][j] = h[i-][j] + ;
  19. p[j] = (node) {, , h[i][j]};
  20. }
  21. sta.push(p[]);
  22. for(int j = ; j <= m; j++) {
  23. while(!sta.empty() && sta.top().val > p[j].val) {
  24. node top = sta.top(); sta.pop();
  25. if(!sta.empty()) sta.top().suf += top.suf;
  26. p[j].pre += top.pre;
  27. square = max(square, (top.suf + top.pre - ) * top.val);
  28. }
  29. sta.push(p[j]);
  30. }
  31. while(!sta.empty()) {
  32. node top = sta.top(); sta.pop();
  33. if(!sta.empty()) sta.top().suf += top.suf;
  34. square = max(square, (top.suf + top.pre - ) * top.val);
  35. }
  36. }
  37. if(square >= k) return true;
  38. return false;
  39. }
  40.  
  41. void solve() {
  42. int t;
  43. scanf("%d", &t);
  44. while(t--) {
  45. scanf("%d%d%d", &n, &m, &k);
  46. int r = , l = , ans;
  47. for(int i = ; i <= n; i++) {
  48. for(int j = ; j <= m; j++) {
  49. scanf("%lld", &mat[i][j]);
  50. if(mat[i][j] < l) l = mat[i][j];
  51. if(mat[i][j] > r) r = mat[i][j];
  52. }
  53. }
  54. ans = l;
  55. while(l <= r) {
  56. int mid = (l + r) >> ;
  57. if(check(mid)) l = mid + , ans = mid;
  58. else r = mid - ;
  59. }
  60. check(ans);
  61. printf("%d %d\n", ans, square);
  62. }
  63. }
  64.  
  65. int main() {
  66. solve();
  67. return ;
  68. }

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. Linux 系统安装(5分钟)

    安装版本:CentOS 6.5 minimal 虚拟机工具:VMware 虚拟机配置:1核2线程 2G内存 50G硬盘 步骤: 一.虚拟机配置 1.打开VMware,创建新的虚拟机,选择典型安装: 2 ...

  2. ASP .NET DropDownList多级联动事件

    思路 假如有三级省.市.区,先加载出所有省选择省之后,加载出该省所有市选择市之后,加载出该市所有区重新选择省,则清空市和区重新选择市,则清空区想好数据结构,不同的数据结构做法不同 例子 数据结构 pu ...

  3. 读BeautifulSoup官方文档之html树的修改

    修改html树无非是对其中标签的改动, 改动标签的名字(也就是类型), 属性和标签里的内容... 先讲这边提供了很方便的方法来对其进行改动... soup = BeautifulSoup('<b ...

  4. jquery 鼠标经过延时触发事件,jquery插件

    jquery 鼠标经过延时触发事件. 用来做:鼠标经过选项卡,延时切换,鼠标经过商城分类延时显示,最好不过,防止用户随便滑动就切换了选项卡. 一.引入jq 二.加入以下插件代码 /* * 鼠标经过延时 ...

  5. vs2015 cordova环境安装【个人遇到的几个问题】

    原文:vs2015 cordova环境安装[个人遇到的几个问题] 问题1: vs2015,设置  Debug  Android 设备[真机调试] Exception in thread "m ...

  6. 【Git】生成Patch和使用Patch

    1.生成Patch(俗称快照) 先来看看repo manifest 的用法 <1>cd /工作目录/项目目录/.repo/manifests <2>repo manifest ...

  7. Android疑难杂症之Theme

    背景:最近在把自己之前写的一个应用换成Material Design风格,在看官方Guide后动手试了一试,没想到出门就遇到了坑,在换成Material Design风格的主题后,我设置了一下colo ...

  8. lvcreate命令

    lvcreate Command Examples on Linux : 1. The following command creates a logical volume 15 gigabytes ...

  9. Linux下的wfopen(手工打造)

    Of Linux on wfopen (open wide-character version of the file name and mode) to achieve Not directly a ...

  10. Long Shadows Generate是一款在线使用纯CSS3实现长阴影的效果,一款强大的扁平化长投影制造器。

    Long Shadows Generate是一款在线使用纯CSS3实现长阴影的效果,一款强大的扁平化长投影制造器. Long Shadows Generate 彩蛋爆料直击现场 Long Shadow ...