题意

输入一个\(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;
}

最新文章

  1. 从国内流程管理软件市场份额看中国BPM行业发展
  2. 我的Android第五章
  3. MySQL 5.6 Warning: Using a password on the command line interface can be insecure
  4. ActiveMQ持久化消息
  5. DHCP服务详解
  6. Zmodem transfer canceled by remote side
  7. python 访问php程序,实现定时
  8. DevExpress控件-- Gridcontrol合并表头
  9. Web分析日志
  10. Fedora19/18/17安装显卡驱动和无限网卡驱动
  11. DataTable转换为LIST
  12. day01_使用Android Studio创建第一个Android项目
  13. 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器
  14. if 语句
  15. python 的基础 学习 11天 作业题
  16. python functools
  17. 【读书笔记】Cronjob原理及源码分析
  18. Docker数据卷容器备份、恢复
  19. python inspect.stack() 的简单使用
  20. Python自定义Module中__init__.py文件介绍

热门文章

  1. Ubuntu下使用Git_6
  2. 在Android上Kotlin的单元测试(KAD22)
  3. 第十五次ScrumMeeting会议
  4. 团队项目-第五次Scrum 会议
  5. c#程序中的AssemblyInfo.cs
  6. Python中enumerate函数用法详解
  7. Mac下离线安装SDK
  8. LTE 中基于X2的切换
  9. css实现div一直旋转
  10. php在类里如何调用call_user_func_array《细说php2》