UVa 12265 贩卖土地 单调栈
题意
输入一个\(n\times m\)的矩阵,每个格子可能是空地,也可能是沼泽。对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次。
思路
对于 每一行 每两个沼泽之间的连续部分 维护一个单调栈,维护对于当前位置(右下角位置)可取的前面的一系列的左上角位置。
因为向右移动时新加进来一个较低的会将之前高的削低,即会修改之前栈中可行的点的高度,所以本题中仅维护位置是不够的,需要维护位置\(c\)和高度\(h\)两个属性。
注意到,\(c\)显然是单调增的,单调栈维护的单调的属性是\(c-h\)单调增(即周长单调增),故\(h\)也是单调增的。
向右移动时,考虑新加进来的一个造成的影响,将前面一整段高度\(\geq h\)的削成\(h\),这就导致只有最前面的一个可能有用,至于究竟有没有用呢,和它前面一个比一比就行,毕竟要维护的是单调增的属性。
Code
#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
#define maxn 1010
char str[maxn];
int h[maxn], cnt[maxn<<2];
using namespace std;
typedef long long LL;
struct node { int h, c; }s[maxn];
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n, m;
scanf("%d%d", &n, &m);
memset(h, 0, sizeof h);
memset(cnt, 0, sizeof cnt);
F2(i, 1, n) {
scanf("%s", str+1);
int top = 0;
F2(j, 1, m) {
if (str[j]=='#') { h[j] = top = 0; continue; }
++h[j];
node temp;
if (!top || s[top-1].h < h[j]) temp = {h[j], j};
else {
while (top && s[top-1].h>=h[j]) --top;
temp = {h[j], s[top].c};
}
if (!top || temp.h-temp.c > s[top-1].h-s[top-1].c) s[top++] = temp;
int area = (s[top-1].h+j-s[top-1].c+1) << 1;
++cnt[area];
}
}
F2(i, 1, (m+n)<<1) if (cnt[i]) printf("%d x %d\n", cnt[i], i);
}
return 0;
}
UVa 12265 贩卖土地 单调栈的更多相关文章
- uva12265 贩卖土地 单调栈
输入一个n*m的矩阵,每个格子可能是空地,也可能是沼泽.对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次. 输入包含多组测试数据,第一行输入一个正整数N,表示输入样例 ...
- uva 12265 贩卖土地
题目大意: 有一个矩阵 有些点可以取有些不能 求以每个点为右下角的子矩阵(里面点都可以取)的周长最大值 最后统计出每个周长对应矩阵的个数 思路: 单调栈 先预处理出每个点向上最多能延伸多长记为h(i, ...
- 紫书 例题8-19 UVa 12265 (扫描法+单调栈)
首先可以用扫描法处理出一个height数组, 来保存从当前行开始, 每一个格子可以向上延伸的最大长度. 这种"延伸"的问题用扫描法, 因为往往这个时候可以利用前一次的结果来更新当前 ...
- UVa 12265 (单调栈) Selling Land
紫书上分析了很多很多,超详细,= ̄ω ̄= 每扫描一行可以计算一个height数组,表示从这块空地向上延伸多少块空地,而且这个数组可以逐行递推. 首先对于每一行来说维护一个单调栈,栈里放的是矩形的左上角 ...
- UVa 1451 (数形结合 单调栈) Average
题意: 给出一个01串,选一个长度至少为L的连续子串,使得串中数字的平均值最大. 分析: 能把这道题想到用数形结合,用斜率表示平均值,我觉得这个想法太“天马行空”了 首先预处理子串的前缀和sum,如果 ...
- uva 1619 - Feel Good || poj 2796 单调栈
1619 - Feel Good Time limit: 3.000 seconds Bill is developing a new mathematical theory for human ...
- UVA 1619/POJ2796 滑窗算法/维护一个单调栈
Feel Good Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 12409 Accepted: 3484 Case T ...
- 【BZOJ】3039: 玉蟾宫(DP/单调栈)
http://www.lydsy.com/JudgeOnline/problem.php?id=3039 每次看到我的提交都有点淡淡的忧伤T_T.. 看到此题我想到用前缀和维护点ij向左和向上能拓展的 ...
- P4147 玉蟾宫--单调栈
P4147 玉蟾宫 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子 ...
随机推荐
- 揭秘css
这是我看到非常好的一本电子教程,可以当参考手册使用,链接
- 【app.js】配置及App函数说明
app.js中的App函数用来注册一个小程序或设置全局变量. App函数: 语法:App(Object) 参数: Object json对象 说明: App函数必须在app.js中调用 ...
- 修改freemarker的ftl时,不重启tomcat的办法(使用了springMVC)
一.在使用Freemarker 时,需要在spring-mvc.xml 配置文件中作如下配置: <!-- 配置freeMarker的模板路径 --> <bean id="f ...
- Ext.Net中如何获取组件
我们在编写函数function的时候,常常需要用到页面上的组件.这时候就需要调用组件. 在Ext.net中,调用组件可以用.App.ID.(ID指的是想要调用的组件的ID). 例如: 我写一个函数需要 ...
- elasticsearch this is not a http port
访问的是elastic search的tcp端口,需换成http端口. elastic search默认tcp端口9300,http端口9200 如果浏览器中访问http://localhost:92 ...
- Redis集群操作手册
一.原始集群(6节点 3主3从): (1)启动集群: [root@bhz004 ~]# /usr/local/redis/bin/redis-server /usr/local/redis-clust ...
- Antlr 在 idea 中正确使用的方式
问题 Caused by: java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN ...
- Oracle 同环比排除分母0
A 本期 B 同期(环期) 同比(环比) = (A-B)/B DECODE(NVL(B,0),0,0,ROUND(((A-B)/B),4)), --环比 DECODE(NVL(B),0,0,ROUN ...
- [洛谷P3254]圆桌问题
题目大意:有$m$个单位,每个单位有$r_i$个代表,有$n$张餐桌,每张餐桌可容纳$c_i$个代表.要求同一个单位的代表不在同一个餐桌就餐.若可以,输出$1$以及其中一种方案,否则输出$0$ 题解: ...
- 导致SQL执行慢的原因
索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左 ...