zoukankan      html  css  js  c++  java
  • BZOJ3726 : PA2014Final Wykladzina

    从上到下枚举下底边,维护$a[i]$表示$i$向上延伸多少距离里面没有坏点,$b[i]$表示$i$向上延伸多少距离里面最多只有1个坏点。

    设$l0[i],r0[i]$表示以$a[i]$为最小值,往左往右能延伸到哪里,$l1[i],r1[i]$表示以$b[i]$为最小值,往左往右能延伸到哪里。

    枚举$i$,有两种情况:

    1.$a[i]$为最小值,那么找到$l0[i]$,将其左边的数用$b$进行替代,然后再找到前驱$L$;或者找到$r0[i]$,将其右边的数用$b$进行替代,然后再找到后继$R$。

    2.$b[i]$为最小值,那么此时最优解显然是$[l1[i],r1[i]]$。

    对于$L,R$的求解,可以先将所有$a$从大到小进行桶排序,建立一个双向链表,然后从大到小删除每一个,同时询问前驱与后继。

    时间复杂度$O(nm)$。

    #include<cstdio>
    #define N 2010
    int n,m,T,i,j,l0[N],r0[N],l1[N],r1[N],a[N],b[N],G[N],NXT[N],pre[N],nxt[N],L[N],R[N],ans;char s[N];
    inline void add(int x,int y){NXT[y]=G[x];G[x]=y;}
    inline void del(int x){pre[nxt[x]]=pre[x];nxt[pre[x]]=nxt[x];}
    inline void up(int x){if(ans<x)ans=x;}
    int main(){
      scanf("%d%d",&n,&m);
      for(i=1;i<=m;i++)l0[i]=l1[i]=1,r0[i]=r1[i]=m;
      for(T=1;T<=n;T++){
        scanf("%s",s+1);
        for(i=j=1;i<=m;i++)if(s[i]=='.'){
          a[i]++,b[i]++;
          if(l0[i]<j)l0[i]=j;
          if(l1[i]<j)l1[i]=j;
        }else{
          b[i]=a[i]+1,a[i]=0;
          l1[i]=l0[i],l0[i]=1;
          if(l1[i]<j)l1[i]=j;
          j=i+1;
        }
        for(i=j=m;i;i--)if(s[i]=='.'){
          if(r0[i]>j)r0[i]=j;
          if(r1[i]>j)r1[i]=j;
        }else{
          r1[i]=r0[i],r0[i]=m;
          if(r1[i]>j)r1[i]=j;
          j=i-1;
        }
        for(i=0;i<=T;i++)G[i]=0;
        for(i=m;i;i--)add(a[i],i),pre[i]=i-1,nxt[i]=i+1;
        for(pre[1]=0,nxt[m]=m+1,i=T;~i;i--)for(j=G[i];j;j=NXT[j])L[j]=pre[pre[j]],del(j);
        for(i=0;i<=T;i++)G[i]=0;
        for(i=1;i<=m;i++)add(a[i],i),pre[i]=i-1,nxt[i]=i+1;
        for(pre[1]=0,nxt[m]=m+1,i=T;~i;i--)for(j=G[i];j;j=NXT[j])R[j]=nxt[nxt[j]],del(j);
        for(i=1;i<=m;i++){
          up((r1[i]-l1[i]+1)*b[i]);
          if(!a[i])continue;
          j=l0[i];
          if(j>1&&b[j-1]>=a[i])j=L[i]+1;
          up((r0[i]-j+1)*a[i]);
          j=r0[i];
          if(j<m&&b[j+1]>=a[i])j=R[i]-1;
          up((j-l0[i]+1)*a[i]);
        }
      }
      return printf("%d",ans),0;
    }
    

      

  • 相关阅读:
    架构设计流程:评估和选择备选方案
    架构设计流程:设计备选方案
    架构设计三原则
    迭代器模式(电视机遥控器)
    外观模式
    5.组合模式
    完成动物识别,自行拍摄动物图片进行上传并查看结果
    4.桥接模式 (毛笔和颜色)
    企业沟通机制
    完成植物识别,自行拍摄植物图片进行上传并查看结果
  • 原文地址:https://www.cnblogs.com/clrs97/p/5240007.html
Copyright © 2011-2022 走看看