【codeforces】480E Parking Lot
阿新 • • 發佈:2019-02-14
#include <stdio.h> #include <algorithm> #include <string.h> #define rep(ii,a,b) for (int ii=(a);ii<=(b);ii++) #define rek(ii,a,b) for (int ii=(a);ii>=(b);ii--) using namespace std; int n,m,kk; char s[2005]; int a[2001][2001],up[2001][2001],down[2001][2001],f[2001][2001]; int ans[2001],qx[2001],qy[2001],qup[2001],qdown[2001],b[2001],c[2001]; int nowans; bool check(int row,int length){ if (length>min(n,m)) return false; int l=1,r=1,ll=1,rr=1; qup[l]=1;qdown[1]=1; rep(i,1,m) b[i]=up[row][i]; rep(i,1,m) c[i]=down[row][i]; if (1>=length) if (b[qup[l]]+c[qdown[ll]]-1>=length) return true; rep(i,2,m){ while (b[qup[r]]>=b[i] && r>=l) r--; r++;qup[r]=i; if (i>=length && qup[l]<=i-length) l++; ///------------- while (c[qdown[rr]]>=c[i] && rr>=ll) rr--; rr++;qdown[rr]=i; if (i>=length && qdown[ll]<=i-length) ll++; ///------- if (i>=length) if (b[qup[l]]+c[qdown[ll]]-1>=length) return true; } return false; } int main(){ scanf("%d%d%d",&n,&m,&kk); nowans=0; rep(i,1,n){ scanf("%s",s); rep(j,0,m-1) a[i][j+1]=(s[j]=='X')?0:1; } rep(i,1,kk){ scanf("%d%d",&qx[i],&qy[i]); a[qx[i]][qy[i]]=0; } rep(i,1,n) rep(j,1,m) nowans=max(nowans,a[i][j]); rep(i,1,m) up[1][i]=a[1][i]; rep(i,2,n) { rep(j,1,m){ up[i][j]=a[i][j]==1?up[i-1][j]+1:0; } } rep(i,1,m) down[n][i]=a[n][i]; rek(i,n-1,1) { rep(j,1,m){ down[i][j]=a[i][j]==1?down[i+1][j]+1:0; } } rep(i,1,n) f[i][1]=a[i][1]; rep(j,1,m) f[1][j]=a[1][j]; rep(i,2,n) rep(j,2,m){ if (a[i][j]==0) f[i][j]=0; else f[i][j]=min(min(f[i-1][j-1],f[i-1][j]),f[i][j-1])+1; nowans=max(nowans,f[i][j]); } ans[kk]=nowans; rek(ii,kk,2){ a[qx[ii]][qy[ii]]=1; up[1][qy[ii]]=a[1][qy[ii]]; rep(i,2,n) if (a[i][qy[ii]]==0) up[i][qy[ii]]=0;else up[i][qy[ii]]=up[i-1][qy[ii]]+1; down[n][qy[ii]]=a[n][qy[ii]]; rek(i,n-1,1) if (a[i][qy[ii]]==0) down[i][qy[ii]]=0;else down[i][qy[ii]]=down[i+1][qy[ii]]+1; int t=0; rek(i,12,0) if (check(qx[ii],t+(1<<i))) t+=(1<<i); nowans=max(nowans,t); ans[ii-1]=nowans; } rep(i,1,kk) printf("%d\n",ans[i]); }
該題參考了http://blog.csdn.net/u013368721/article/details/40626527 的做法。
但是由於智商捉急,完全沒看懂這位大神的線段樹做法。
不過很顯然,對於影響的這一行,顯然具有可以二分答案的性質,然後我們可以用一個單調佇列來判斷是否合法。
於是該題得到解決。
程式碼: