2019牛客暑期多校训练营(第二场)- H Second Large Rectangle
时间:2019-07-20
本文章向大家介绍2019牛客暑期多校训练营(第二场)- H Second Large Rectangle,主要包括2019牛客暑期多校训练营(第二场)- H Second Large Rectangle使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
单调栈
单调栈找出每以每个点所在的行为底能够产生的最大矩形面积,然后放进优先队列。
要找的是次大值,所以可能他的子矩阵也是我们要的答案,所有还有把当前矩阵长-1,宽-1的面积也放进去。
最后去重,对于相同的面积,我们在保存左右边界,这样矩形的长被确定了,所以宽也被确定了,这个矩形就被确定了,我们可以通过比较左右边界是否相同来判断是否出队的是同一个矩形,如果是就不管它,不是则记录答案。
#include <bits/stdc++.h>
#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 <typename T>
inline T max(T x, T y, T z){ return max(max(x, y), z); }
template <typename T>
inline T min(T x, T y, T z){ return min(min(x, y), z); }
template <typename A, typename B, typename C>
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<Node> 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
- JDK容器学习之ArrayList:底层存储和动态扩容
- Linux基础(day57)
- 15.2/15.3 使用vsftpd搭建ftp
- JDK容器学习之Map: HashMap,TreeMap,LinkedHashMap对比小结
- 14.4 exportfs命令
- 不用那么多,每天一点点,学习React,贵在持之以恒
- Linux基础(day56)
- android classloader双亲委托模式
- 14.3 NFS配置选项
- 14.2 NFS服务端安装配置
- React Native组件之Button
- JDK容器学习之TreeMap (二) : 使用说明
- 从React和angular看技术路线的分歧
- JDK容器学习之LinkedHashMap (一):底层存储结构分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [译]基于以太坊和USDC搭建去中心化金融系统
- 使用Substrate开发区块链存证dApp
- Flutter Dojo设计之道——如何打造一个通用的Playground
- [译]构建去中心化智能合约编程货币
- 你不知道c语言写的程序要多块——以NGS fastq文件reads计数为例
- JVM系列之:从汇编角度分析Volatile
- JVM系列之:从汇编角度分析NullCheck
- 基于机器学习的文本分类!
- JVM系列之:再谈java中的safepoint
- 《图解算法》第2章 选择排序
- 《图解算法》第3章 递归
- 《图解算法》第4章 快速排序
- 基于H5的Speedtest网速测试工具搭建
- Phaser类在性能测试中应用
- Mockito框架Mock Void方法