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;
    }
    

      

  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/clrs97/p/5240007.html
Copyright © 2011-2022 走看看