uva12462 Rectangle题解

来源:互联网 发布:subversion mac 编辑:程序博客网 时间:2024/06/07 00:12

题目大意:

有n(<=10^5)个矩形依次相邻,m(<=30)种颜色。第i个矩形高度h[i],宽度为1,颜色为c[i]。求一个面积最大的大矩形,要求大矩形是由这些矩形组成,且大矩形中包含m种颜色。


可以的:

PICPICPIC

不可以的:

PICPICPIC

题解:

可以说是广告印刷加强版
对与每个h[i],单调队列找左极限和右极限
对于要求区间每种颜色都有,可以开一个color[i][j]数组表示到i为止j颜色个数,最后枚举时只需要判定是否对于所有的j(1<=j<=m)是否满足color[r[i]][j]-color[l[i]-1][j]>0.

时间复杂度O(n*m)

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;const int maxn=100100;long long color[maxn][35];int q[maxn];long long l[maxn],r[maxn],h[maxn];int n,m,tail;int main(){    while(scanf("%d%d",&n,&m),n||m)    {        for(int i=1;i<=n;i++)        scanf("%lld",&h[i]);        h[0]=0;h[n+1]=0;        for(int i=0;i<=n;i++)         for(int j=0;j<=m;j++)         color[i][j]=0;        for(int i=1;i<=n;i++)        {            int x;scanf("%d",&x);x++;            for(int j=1;j<=m;j++)            color[i][j]=color[i-1][j]+(j==x);        }        //pre        tail=0;q[0]=0;        for(int i=1;i<=n;i++)        {            while(h[i]<=h[q[tail]])tail--;            l[i]=q[tail]+1;            tail++;q[tail]=i;        }        tail=0;q[0]=n+1;        for(int i=n;i>=1;i--)        {            while(h[i]<=h[q[tail]])tail--;            r[i]=q[tail]-1;            tail++;q[tail]=i;        }        long long ans=0;        for(int i=1;i<=n;i++)        {            long long s=l[i],t=r[i];            bool flag=true;            for(int j=1;j<=m;j++)            if(color[t][j]-color[s-1][j]<=0){flag=false;break;}            if(flag && (t-s+1)*h[i]>ans)ans=(t-s+1)*h[i];        }        printf("%lld\n",ans);    }    return 0;}


原创粉丝点击