首页 > 代码库 > 「Poetize4」玉蟾宫

「Poetize4」玉蟾宫

描述 Description
这片土地被分成N*M个格子,每个格子里写着‘R‘或者‘F‘,R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。
现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着‘F‘并且面积最大。
但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。
题解:
类似与ZJOI2007制作棋盘,这叫悬线法?我感觉就是一个单调栈而已。。。
代码:
 1 #include<cstdio> 2  3 #include<cstdlib> 4  5 #include<cmath> 6  7 #include<cstring> 8  9 #include<algorithm>10 11 #include<iostream>12 13 #include<vector>14 15 #include<map>16 17 #include<set>18 19 #include<queue>20 21 #include<string>22 23 #define inf 100000000024 25 #define maxn 120026 27 #define maxm 500+10028 29 #define eps 1e-1030 31 #define ll long long32 33 #define pa pair<int,int>34 35 #define for0(i,n) for(int i=0;i<=(n);i++)36 37 #define for1(i,n) for(int i=1;i<=(n);i++)38 39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)40 41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)42 43 #define mod 100000000744 45 using namespace std;46 47 inline int read()48 49 {50 51     int x=0,f=1;char ch=getchar();52 53     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}54 55     while(ch>=0&&ch<=9){x=10*x+ch-0;ch=getchar();}56 57     return x*f;58 59 }60 int n,m,ans,h[maxn],l[maxn],r[maxn],sta[maxn];61 62 int main()63 64 {65 66     freopen("input.txt","r",stdin);67 68     freopen("output.txt","w",stdout);69 70     n=read();m=read();71     h[0]=h[m+1]=-1;72     for1(i,n)73     {74         for1(j,m)75         {76             char ch= ;77             while(ch!=F&&ch!=R)ch=getchar();78             if(ch==F)h[j]++;else h[j]=0;79         }80         int top=0;81         for1(j,m+1)82         {83             while(top&&h[j]<h[sta[top]])r[sta[top--]]=j-1;84             sta[++top]=j;85         }86         top=0;87         for3(j,m,0)88         {89             while(top&&h[j]<h[sta[top]])l[sta[top--]]=j+1;90             sta[++top]=j;91         }92         for1(j,m)ans=max(ans,h[j]*(r[j]-l[j]+1));93     }94     printf("%d\n",3*ans);95 96     return 0;97 98 }
View Code

 

「Poetize4」玉蟾宫