码迷,mamicode.com
首页 > 其他好文 > 详细

uva 12265 贩卖土地

时间:2017-10-01 13:40:31      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:思路   延伸   while   memset   play   line   矩形   记录   main   

题目大意

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

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

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

思路:

单调栈

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

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

该单调栈满足高单调递增

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

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

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<cstring>
 7 #include<queue>
 8 #include<vector>
 9 #define ll long long
10 #define inf 2147483611
11 #define MAXN 1010
12 #define MOD
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;
17     char ch;ch=getchar();
18     while(!isdigit(ch)) {if(ch==-) f=-1;ch=getchar();}
19     while(isdigit(ch)) {x=x*10+ch-0;ch=getchar();}
20     return x*f;
21 }
22 int pos,top,T,n,m,ans[MAXN*2],h[MAXN][MAXN];
23 char map[MAXN];
24 struct data
25 {
26     int x,y;
27 }s[MAXN];
28 int main()
29 {
30     T=read();
31     while(T--)
32     {
33         n=read(),m=read();
34         memset(h,0,sizeof(h));
35         memset(ans,0,sizeof(ans));
36         for(int i=1;i<=n;i++)
37         {
38             scanf("%s",map+1);
39             for(int j=1;j<=m;j++) 
40                 if(map[j]==.) h[i][j]=h[i-1][j]+1;
41         }
42         for(int i=1;i<=n;i++)
43         {
44             memset(s,0,sizeof(s));top=0;
45             for(int j=1;j<=m;j++)
46             {
47                 pos=j;
48                 while(top&&s[top].y>=h[i][j]) {pos=s[top].x;top--;}
49                 if(!h[i][j]) continue;
50                 if(!top||h[i][j]-s[top].y>pos-s[top].x) 
51                 {
52                     ans[h[i][j]+j-pos+1]++;
53                     data tmp;tmp.x=pos,tmp.y=h[i][j];
54                     s[++top]=tmp;
55                 }
56                 else ans[s[top].y+j-s[top].x+1]++;
57             }
58         }
59         for(int i=1;i<=n+m;i++)
60         {
61             if(ans[i]) printf("%d x %d\n",ans[i],i*2);
62         }
63     }
64 }
View Code

 

uva 12265 贩卖土地

标签:思路   延伸   while   memset   play   line   矩形   记录   main   

原文地址:http://www.cnblogs.com/yyc-jack-0920/p/7617067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!