博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019牛客暑期多校训练营(第二场)- H Second Large Rectangle
阅读量:4953 次
发布时间:2019-06-11

本文共 3483 字,大约阅读时间需要 11 分钟。

单调栈

单调栈找出每以每个点所在的行为底能够产生的最大矩形面积,然后放进优先队列。

要找的是次大值,所以可能他的子矩阵也是我们要的答案,所有还有把当前矩阵长-1,宽-1的面积也放进去。

最后去重,对于相同的面积,我们在保存左右边界,这样矩形的长被确定了,所以宽也被确定了,这个矩形就被确定了,我们可以通过比较左右边界是否相同来判断是否出队的是同一个矩形,如果是就不管它,不是则记录答案。

#include 
#define INF 0x3f3f3f3f#define full(a, b) memset(a, b, sizeof a)#define FAST_IO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)using namespace std;typedef long long ll;inline int lowbit(int x){ return x & (-x); }inline int read(){ int ret = 0, w = 0; char ch = 0; while(!isdigit(ch)) { w |= ch == '-'; ch = getchar(); } while(isdigit(ch)) ret = (ret << 3) + (ret << 1) + (ch ^ 48), ch = getchar(); return w ? -ret : ret;}inline int gcd(int a, int b){ return b ? gcd(b, a % b) : a; }inline int lcm(int a, int b){ return a / gcd(a, b) * b; }template
inline T max(T x, T y, T z){ return max(max(x, y), z); }template
inline T min(T x, T y, T z){ return min(min(x, y), z); }template
inline A fpow(A x, B p, C lyd){ A ans = 1; for(; p; p >>= 1, x = 1LL * x * x % lyd)if(p & 1)ans = 1LL * x * ans % lyd; return ans;}const int N = 1005;int h[N][N], l[N], r[N], g[N][N];string s[N];struct Node{ int val, l, r; Node(){} Node(int val, int l, int r): val(val), l(l), r(r){} bool operator < (const Node &rhs) const { //if(val != rhs.val) return val < rhs.val; //return l > rhs.l; return val < rhs.val; }};int main(){ int n, m; while(cin >> n >> m){ priority_queue
pq; full(h, 0), full(l, 0), full(r, 0); for(int i = 0; i < n; i ++) cin >> s[i]; for(int i = 1; i <= n; i ++){ for(int j = 1; j <= m; j ++) g[i][j] = s[i - 1][j - 1] - '0'; } for(int j = 1; j <= m; j ++) h[1][j] = g[1][j] == 1 ? 1 : 0; for(int i = 2; i <= n; i ++){ for(int j = 1; j <= m; j++) h[i][j] = g[i][j] == 0 ? 0 : h[i - 1][j] + 1; } for(int i = 1; i <= n; i ++){ for(int j = 1; j <= m; j ++) l[j] = r[j] = j; for(int j = 2; j <= m; j ++){ while(l[j] > 1 && h[i][j] <= h[i][l[j] - 1]) l[j] = l[l[j] - 1]; } for(int j = m - 1;j >= 1; j --){ while(r[j] < m && h[i][j] <= h[i][r[j] + 1]) r[j] = r[r[j] + 1]; } for(int j = 1; j <= m; j ++){ int s = (r[j] - l[j] + 1) * h[i][j]; int x = r[j] - l[j] + 1, y = h[i][j]; //cout << i << " " << j << " " << l[j] << " " << r[j] << endl; pq.push(Node(s, l[j], r[j])), pq.push(Node((x - 1) * y, l[j], r[j])), pq.push(Node(x * (y - 1), l[j], r[j] - 1)); } } int cnt = 0, lx = 0, ly = 0, lval = 0; while(!pq.empty()){ Node cur = pq.top(); pq.pop(); //cout << cur.val << " " << cur.l << " " << cur.r << endl; if(lval == cur.val){ if(cur.l != lx || cur.r != ly){ if(cnt == 1){ printf("%d\n", cur.val); break; } else cnt ++, lx = cur.l, ly = cur.r; } else continue; } else{ if(cnt == 1){ printf("%d\n", cur.val); break; } else cnt ++, lx = cur.l, ly = cur.r, lval = cur.val; } } } return 0;}

转载于:https://www.cnblogs.com/onionQAQ/p/11219164.html

你可能感兴趣的文章
C#jbox小节
查看>>
结构体指针释放的问题
查看>>
C#枚举Enum[轉]
查看>>
第三百五十七天 how can I 坚持
查看>>
【动态规划】流水作业调度问题与Johnson法则
查看>>
startActivityForResult不起作用
查看>>
Python&Selenium&Unittest&BeautifuReport 自动化测试并生成HTML自动化测试报告
查看>>
活现被翻转生命
查看>>
POJ 1228
查看>>
SwaggerUI+SpringMVC——构建RestFul API的可视化界面
查看>>
springmvc怎么在启动时自己执行一个线程
查看>>
流操作的规律
查看>>
Python基础学习15--异常的分类与处理
查看>>
javascript运算符的优先级
查看>>
React + Redux 入门(一):抛开 React 学 Redux
查看>>
13位时间戳和时间格式化转换,工具类
查看>>
vue router-link子级返回父级页面
查看>>
C# 通知机制 IObserver<T> 和 IObservable<T>
查看>>
Code of Conduct by jsFoundation
查看>>
div 只显示两行超出部分隐藏
查看>>