题意:

求第二大子矩形

思路:

设最大子矩形x*y,第二大子矩形一定在一下情况中

(x-1)*y

x*(y-1)

其他最大子矩形候选者

注意去重手法

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. //#include<cmath>
  5. #include<cstring>
  6. #include<string>
  7. #include<stack>
  8. #include<queue>
  9. #include<deque>
  10. #include<set>
  11. #include<vector>
  12. #include<map>
  13.  
  14. #define fst first
  15. #define sc second
  16. #define pb push_back
  17. #define mem(a,b) memset(a,b,sizeof(a))
  18. #define lson l,mid,root<<1
  19. #define rson mid+1,r,root<<1|1
  20. #define lc root<<1
  21. #define rc root<<1|1
  22.  
  23. using namespace std;
  24.  
  25. typedef double db;
  26. typedef long double ldb;
  27. typedef long long ll;
  28. typedef unsigned long long ull;
  29. typedef pair<int,int> PI;
  30. typedef pair<ll,ll> PLL;
  31.  
  32. const db eps = 1e-;
  33. const int mod = 1e9+;
  34. const int maxn = 1e4+;
  35. const int maxm = 2e6+;
  36. const int inf = 0x3f3f3f3f;
  37. //const db pi = acos(-1.0);
  38.  
  39. int a[][];
  40. int l[][];
  41. int r[][];
  42. multiset<int>ans;
  43. int h[][];
  44. int lft[][];
  45. int rt[][];
  46. int n, m;
  47.  
  48. int main(){
  49. scanf("%d %d" ,&n, &m);
  50. for(int i = ; i <= n; i++){
  51. for(int j = ; j <= m; j++){
  52. scanf("%1d",&a[i][j]);
  53. }
  54. }
  55. for(int i = ; i <= n; i++){
  56. int tmp = ;
  57. for(int j = ; j <= m; j++){
  58. if(a[i][j]==)tmp=j;
  59. lft[i][j]=tmp;
  60. }
  61. tmp=m+;
  62. for(int j = m; j >= ; j--){
  63. if(a[i][j]==)tmp=j;
  64. rt[i][j]=tmp;
  65. }
  66. }
  67. PI mx=make_pair(-,-);
  68. int up = -;
  69. int mxs = ;
  70. for(int i = ; i <= n; i++){
  71. for(int j = ; j <= m; j++){
  72. if(i==||a[i-][j]==)h[i][j]=;
  73. else h[i][j]=h[i-][j]+;
  74. if(h[i][j]==){
  75. l[i][j] = lft[i][j];
  76. r[i][j] = rt[i][j];
  77. }
  78. else{
  79. l[i][j] = max(l[i-][j],lft[i][j]);
  80. r[i][j] = min(r[i-][j], rt[i][j]);
  81. }
  82. if(a[i][j]==)continue;
  83. int res = (r[i][j]-l[i][j]-)*h[i][j];
  84. if(res>mxs){
  85. mxs=res;
  86. mx = make_pair(i,j);up=i-h[i][j]+;
  87. }
  88. }
  89. }
  90. int ans = max((r[mx.fst][mx.sc]-l[mx.fst][mx.sc]-)*(h[mx.fst][mx.sc]-),(r[mx.fst][mx.sc]-l[mx.fst][mx.sc]-)*h[mx.fst][mx.sc]);
  91. //printf("%d\n",ans);
  92. for(int i = ; i <= n; i++){
  93. for(int j = ; j <= m; j++){
  94. if(l[i][j]==l[mx.fst][mx.sc]&&r[i][j]==r[mx.fst][mx.sc]&&i-h[i][j]+==up)continue;
  95. int sum = (r[i][j]-l[i][j]-)*h[i][j];
  96. if(sum>ans){
  97. ans=sum;
  98. }
  99. }
  100. }
  101. printf("%d",ans);
  102. return ;
  103. }
  104. /*
  105. 1 2
  106. 11
  107. 3 3
  108. 110
  109. 111
  110. 011
  111. 3 3
  112. 111
  113. 011
  114. 011
  115. 1 4
  116. 1011
  117. 3 4
  118. 1101
  119. 0111
  120. 1111
  121. 7 8
  122. 11110000
  123. 11110000
  124. 00000111
  125. 01110111
  126. 01110111
  127. 01110000
  128. 00000000
  129. 4 4
  130. 1111
  131. 1111
  132. 1111
  133. 1111
  134. 3 3
  135. 111
  136. 010
  137. 010
  138. 2 6
  139. 010011
  140. 001111
  141. 3 3
  142. 011
  143. 111
  144. 111
  145. */

2019牛客多校2 H Second Large Rectangle(悬线法)的更多相关文章

  1. 2019牛客多校第二场H-Second Large Rectangle

    Second Large Rectangle 题目传送门 解题思路 先求出每个点上的高,再利用单调栈分别求出每个点左右两边第一个高小于自己的位置,从而而得出最后一个大于等于自己的位置,进而求出自己的位 ...

  2. 2019牛客多校一 H. XOR (线性基)

    大意: 给定序列, 求所有异或和为$0$的子序列大小之和. 先求出线性基, 假设大小为$r$. 对于一个数$x$, 假设它不在线性基内, 那么贡献为$2^{n-r-1}$ 因为它与其余不在线性基内数的 ...

  3. 2019牛客多校八 H. How Many Schemes (AC自动机,树链剖分)

    大意: 给定树, 每条边有一个字符集合, 给定$m$个模式串, $q$个询问$(u,v)$, 对于路径$(u,v)$中的所有边, 每条边从对应字符集合中取一个字符, 得到一个串$s$, 求$s$至少包 ...

  4. 第二大矩阵面积--(stack)牛客多校第二场-- Second Large Rectangle

    题意: 给你一幅图,问你第二大矩形面积是多少. 思路: 直接一行行跑stack求最大矩阵面积的经典算法,不断更新第二大矩形面积,注意第二大矩形可能在第一大矩形里面. #define IOS ios_b ...

  5. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  6. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  7. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  8. 2019牛客多校 Round4

    Solved:3 Rank:331 B xor 题意:5e4个集合 每个集合最多32个数 5e4个询问 询问l到r个集合是不是都有一个子集的xor和等于x 题解:在牛客多校第一场学了线性基 然后这个题 ...

  9. 2019牛客多校第八场A All-one Matrices 悬线法,单调栈待补

    All-one Matrices 题意 对于一个n,m的01矩阵,问有多少个极大矩阵. 分析 对于悬线法来说,其过程就是枚举极大矩阵的过程,那如何计数呢?对于一个点来说,若其左右边界包含了上一个点的悬 ...

随机推荐

  1. ACM北大暑期课培训第七天

    昨天没时间写,今天补下. 昨天学的强连通分支,桥和割点,基本的网络流算法以及Dinic算法: 强连通分支 定义:在有向图G中,如果任意两个不同的顶点 相互可达,则称该有向图是强连通的. 有向图G的极大 ...

  2. 【转】ArcGIS ADF 实时轨迹问题初步解决方案

    Web ADF 实时轨迹是指在Web客户端指定一资源项,并对资源项进行实进跟踪并绘制出轨迹图.实时绘制可采用Ajax实现服务端与客户端无刷新动态绘制,在.net2.0 框架下可轻易实现:通过客户端时钟 ...

  3. Visual Studio 2019移除/禁用Live Share按钮

    Visual Studio 2019新增了几个按钮,搜索按钮,Live Share按钮,发送反馈按钮,管理员按钮(即 “Live Share”, “Send Feedback” ,“ADMIN”) L ...

  4. 倍增LCA模板

    //https://www.luogu.org/problemnew/show/P3379#include<bits/stdc++.h> #define maxn 500010 #defi ...

  5. Kafka日志压缩剖析

    1.概述 最近有些同学在学习Kafka时,问到Kafka的日志压缩(Log Compaction)问题,对于Kafka的日志压缩有些疑惑,今天笔者就为大家来剖析一下Kafka的日志压缩的相关内容. 2 ...

  6. lisp学习有感--对象化,结构化编程思想

    Lisp程序员总是在写DSL,为自己设计的应用开发专用语言,减少程序中的组件,模块,在构造大型复杂应用时,这变的特别有效. 为什么要模块化,我们通常为复杂应用设计程序时,为了分工协作,会用面向对象化思 ...

  7. NOI3.1 6377:生日相同 2.0

    描述 在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日.试找出所有生日相同的学生. 输入 第一行为整数n,表示有n个学生,n ≤ 180.此后每行包含一个字符 ...

  8. python数据分析常用图大集合

    目录 一.折线图 二.直方图 三.垂直条形图 四.水平条形图 五.饼图 六.箱线图 七.热力图 八.散点图 九.蜘蛛图 十.二元变量分布 十一.面积图 十二.六边形图 以下默认所有的操作都先导入了Nu ...

  9. LeetCode-指针法

    LeetCode刷题总结-指针法 方法介绍:指针法主要使用在一组按从小到大排好序的数组中,当按照条件查找对应元素时,在数组的前后定义两个指针,当两个指针代表的元素进行运算时:若结果大于目标值,则左移右 ...

  10. TypeScript躬行记(4)——泛型

    泛型是程序设计语言中的一种风格或范式,相当于类型模板,允许在声明类.接口或函数等成员时忽略类型,而在未来使用时再指定类型,其主要目的是为它们提供有意义的约束,提升代码的可重用性. 一.泛型参数 当一个 ...