TYVJ1939 玉蟾宫

Posted SilverNebula

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TYVJ1939 玉蟾宫相关的知识,希望对你有一定的参考价值。

 

背景

有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。

描述

这片土地被分成N*M个格子,每个格子里写着‘R‘或者‘F‘,R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。
现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着‘F‘并且面积最大。
但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。

输入格式

第一行两个整数N,M,表示矩形土地有N行M列。
接下来N行,每行M个用空格隔开的字符‘F‘或‘R‘,描述了矩形土地。

输出格式

输出一个整数,表示你能得到多少银子,即(3*最大‘F‘矩形土地面积)的值。

测试样例1

输入

5 6 
R F F F F F 
F F F F F F 
R R R F F F 
F F F F F F 
F F F F F F

输出

45

备注

对于50%的数据,1<=N,M<=200
对于100%的数据,1<=N,M<=1000
 
 
扫描处理每列。对于每一列j,枚举该列上F的长度h[j],再从左往右扫一遍,找h[j]高度的F能向左延伸到多远,再从右往左扫,找向右延伸的距离。左右边界和高度确定后,计算面积并更新最优解。
左右扫描的过程中用单调栈维护最小高度。
 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int mxn=1200;
 8 int st[mxn],top;
 9 int h[mxn];
10 int mp[mxn][mxn];
11 int le[mxn],re[mxn];
12 int ans=0;
13 int n,m;
14 void read(){//读入 
15     char s;
16     for(int i=1;i<=n;i++){
17         for(int j=1;j<=m;j++){
18             s=getchar();
19             while(s!=F && s!=R)s=getchar();
20             mp[i][j]=(s==F);
21         }
22     }
23     return;
24 }
25 int main(){
26     scanf("%d%d",&n,&m);
27     int i,j;
28     read();
29     for(i=1;i<=n;i++){//
30         for(j=1;j<=m;j++){//
31             if(mp[i][j])h[j]++;
32             else h[j]=0;
33         }
34         top=0;
35         st[0]=0;
36         for(j=1;j<=m;j++){
37             while(top && h[st[top]]>=h[j])top--;//单调栈维护边界 
38             le[j]=st[top];//左边界 
39             st[++top]=j;//入栈 
40         }
41         top=0;
42         st[0]=m+1;
43         for(j=m;j;j--){
44             while(top && h[st[top]]>=h[j])top--;
45             re[j]=st[top]-1;
46             st[++top]=j;
47         }
48         for(j=1;j<=m;j++){
49 //            printf("test: I:%d J:%d L:%d R:%d H:%d \n",i,j,le[j],re[j],h[j]);
50             ans=max(ans,(re[j]-le[j])*h[j]);
51         }
52     }
53     printf("%d\n",3*ans);
54     return 0;
55 }

 

 

以上是关于TYVJ1939 玉蟾宫的主要内容,如果未能解决你的问题,请参考以下文章

[Tyvj1939] 玉蟾宫(单调栈)

bzoj3039 joyoi1939 玉蟾宫 悬线法

2491 玉蟾宫

[BZOJ3039]玉蟾宫

P4147 玉蟾宫

codevs 2491 玉蟾宫