zoukankan      html  css  js  c++  java
  • 【BZOJ3039】玉蟾宫 单调栈

    【BZOJ3039】玉蟾宫

    Description

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

    Input

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

    Output

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

    Sample Input

    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

    Sample Output

    45

    HINT

    对于50%的数据,1<=N,M<=200
    对于100%的数据,1<=N,M<=1000

    题解:这题就想对于每一行都进行一次询问,然后变成每个点都有一个高度,求组成的最大矩形面积。

    具体地,我们对于每个点都维护一个height[i][j]表示i向下最多有多少格是F。那么枚举每一行,然后用单调栈维护每个点左面和右面height第一个比它小的,然后用这个形成的矩形更新答案即可。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    int n,m,ans,top;
    char str[5];
    int h[1010][1010],ls[1010],rs[1010],st[1010];
    int main()
    {
    	scanf("%d%d",&n,&m);
    	int i,j;
    	for(i=1;i<=n;i++)	for(j=1;j<=m;j++)
    	{
    		scanf("%s",str);
    		if(str[0]=='F')	h[i][j]=h[i-1][j]+1;
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(top=0,j=1;j<=m;j++)
    		{
    			while(top&&h[i][st[top]]>=h[i][j])	top--;
    			ls[j]=st[top],st[++top]=j;
    		}
    		for(top=0,j=m;j>=1;j--)
    		{
    			while(top&&h[i][st[top]]>=h[i][j])	top--;
    			rs[j]=(!top)?m+1:st[top],st[++top]=j;
    			ans=max(ans,(rs[j]-ls[j]-1)*h[i][j]);
    		}
    	}
    	printf("%d",ans*3);
    	return 0;
    }
  • 相关阅读:
    EntityFramework 启用迁移 EnableMigrations 报异常 "No context type was found in the assembly"
    JAVA 访问FTP服务器示例(2)
    NuGet Package Manager 更新错误解决办法
    JAVA 访问FTP服务器示例(1)
    RemoteAttribute 的使用问题
    诡异的 javascript 变量
    javascript apply用法
    Babun 中文乱码
    GSM呼叫过程
    转站博客园
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7691085.html
Copyright © 2011-2022 走看看