题目大意:

有一个矩阵 有些点可以取有些不能

求以每个点为右下角的子矩阵(里面点都可以取)的周长最大值

最后统计出每个周长对应矩阵的个数

思路:

单调栈

先预处理出每个点向上最多能延伸多长记为h(i,j)

然后对于每行维护一个单调栈记录每行最远可以达到的左端点和该矩形的高

该单调栈满足高单调递增

每次加入一个元素时,判断新增加的高度是否比减去的长度多

若是,就加入栈,反之不入栈

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
#define ll long long
#define inf 2147483611
#define MAXN 1010
#define MOD
using namespace std;
inline int read()
{
int x=,f=;
char ch;ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int pos,top,T,n,m,ans[MAXN*],h[MAXN][MAXN];
char map[MAXN];
struct data
{
int x,y;
}s[MAXN];
int main()
{
T=read();
while(T--)
{
n=read(),m=read();
memset(h,,sizeof(h));
memset(ans,,sizeof(ans));
for(int i=;i<=n;i++)
{
scanf("%s",map+);
for(int j=;j<=m;j++)
if(map[j]=='.') h[i][j]=h[i-][j]+;
}
for(int i=;i<=n;i++)
{
memset(s,,sizeof(s));top=;
for(int j=;j<=m;j++)
{
pos=j;
while(top&&s[top].y>=h[i][j]) {pos=s[top].x;top--;}
if(!h[i][j]) continue;
if(!top||h[i][j]-s[top].y>pos-s[top].x)
{
ans[h[i][j]+j-pos+]++;
data tmp;tmp.x=pos,tmp.y=h[i][j];
s[++top]=tmp;
}
else ans[s[top].y+j-s[top].x+]++;
}
}
for(int i=;i<=n+m;i++)
{
if(ans[i]) printf("%d x %d\n",ans[i],i*);
}
}
}

uva 12265 贩卖土地的更多相关文章

  1. UVa 12265 贩卖土地 单调栈

    题意 输入一个\(n\times m\)的矩阵,每个格子可能是空地,也可能是沼泽.对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次. 思路 对于 每一行 每两个沼泽之 ...

  2. UVa 12265 - Selling Land

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. uva12265 贩卖土地 单调栈

    输入一个n*m的矩阵,每个格子可能是空地,也可能是沼泽.对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次. 输入包含多组测试数据,第一行输入一个正整数N,表示输入样例 ...

  4. UVa 12265 (单调栈) Selling Land

    紫书上分析了很多很多,超详细,= ̄ω ̄= 每扫描一行可以计算一个height数组,表示从这块空地向上延伸多少块空地,而且这个数组可以逐行递推. 首先对于每一行来说维护一个单调栈,栈里放的是矩形的左上角 ...

  5. 紫书 例题8-19 UVa 12265 (扫描法+单调栈)

    首先可以用扫描法处理出一个height数组, 来保存从当前行开始, 每一个格子可以向上延伸的最大长度. 这种"延伸"的问题用扫描法, 因为往往这个时候可以利用前一次的结果来更新当前 ...

  6. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...

  7. 1597: [Usaco2008 Mar]土地购买

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4023  Solved: 1470[Submit] ...

  8. 土地购买(bzoj 1597)

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...

  9. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

随机推荐

  1. 用ffmpeg切割音频文件

    ffmpeg -i audio.wav -f segment -segment_time -c copy audio%02d.wav "-segment_time 60" 表示每6 ...

  2. leetcode-832翻转图像

    翻转图像 思路: 先对图像进行水平翻转,然后反转图片(对每个像素进行异或操作) 代码: class Solution: def flipAndInvertImage(self, A: List[Lis ...

  3. ZOJ 3905 Cake

    Cake Time Limit: 4 Seconds      Memory Limit: 65536 KB Alice and Bob like eating cake very much. One ...

  4. windows 下 iptables

    windows自带的防火墙就可以. 在命令行方式下输入netsh回车,再输入firewall回车,之后想干什么就干什么. 头一次见对图形化防火墙头晕的...

  5. [luoguP1328] 生活大爆炸版石头剪刀布(模拟)

    传送门 虽然是模拟,但是我们可以用矩阵保存结果,来是其更加简便. ——代码 #include <cstdio> #include <iostream> ][] = {{, , ...

  6. Codeforces 651E Table Compression【并查集】

    题目链接: http://codeforces.com/problemset/problem/650/C 题意: 给定n*m的矩阵,要求用最小的数表示每个元素,其中各行各列的大小关系保持不变. 分析: ...

  7. POJ2586 Y2K Accounting Bug 解题报告

    Description Accounting for Computer Machinists (ACM) has sufferred from the Y2K bug and lost some vi ...

  8. 【.Net 学习系列】-- .Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)

    创建一个Windows服务项目:解决方案(右击)——> 添加 ——> 新建项目——>项目类型选择Windows——>模板选择Windows服务 ,如图: 编写Windows服务 ...

  9. 一句话创建Jupyter For TensorFlow

    docker run -v /home/jupyter_files:/home/jovyan/work -it -d --rm -p 10082:8888 jupyter/tensorflow-not ...

  10. nodejs连接sqlserver

    nodejs连接sqlserver http://blog.csdn.net/kkkkkxiaofei/article/details/31353091