CF 480 E. Parking Lot
2018-09-07 18:58
148 查看
CF 480 E. Parking Lot
http://codeforces.com/contest/480/problem/E
题意:
给一个n*m的01矩阵,每次可以将一个0修改为1,求最大全0的矩阵。
分析:
将询问离线,从后往前处理询问,相当于每次将一个1变成0,答案是递增的。
代码:
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<iostream> #include<cctype> #include<set> #include<vector> #include<queue> #include<map> using namespace std; typedef long long LL; inline int read() { int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f; } const int N = 2010; char a ; int x , y , L , R , U , D , q1 , q2 , ans , sk ; int Ans, n, m; void solve() { for (int i=1; i<=n; ++i) for (int j=1; j<=m; ++j) U[i][j] = a[i][j] == '.' ? U[i-1][j] + 1 : 0; for (int i=n; i>=1; --i) for (int j=1; j<=m; ++j) D[i][j] = a[i][j] == '.' ? D[i+1][j] + 1 : 0; for (int i=1; i<=n; ++i) { // 单调栈 U[i][0] = U[i][m+1] = -1; for (int top=0,j=1; j<=m+1; ++j) { while (top > 0 && U[i][j] < U[i][sk[top]]) R[sk[top]] = j, top--; sk[++top] = j; } for (int top=0,j=m; j>=0; --j) { while (top > 0 && U[i][j] < U[i][sk[top]]) L[sk[top]] = j, top --; sk[++top] = j; } for (int j=1; j<=m; ++j) Ans = max(Ans, min(U[i][j], R[j] - L[j] - 1)); } /*memset(R, 0x3f, sizeof(R)); // 悬线法 for (int i=1; i<=n; ++i) { int last = 0; for (int j=1; j<=m; ++j) { if (a[i][j] == '.') L[j] = max(L[j], last + 1); else last = j, L[j] = 0; } last = m + 1; for (int j=m; j>=1; --j) { if (a[i][j] == '.') R[j] = min(R[j], last - 1); else last = j, R[j] = m + 1; } for (int j=1; j<=m; ++j) Ans = max(Ans, min(U[i][j], R[j] - L[j] + 1)); }*/ } bool update(int x,int k) { // 判断能否组成k*k的方阵 int L1 = 1, R1 = 0, L2 = 1, R2 = 0; for (int j=1; j<=m; ++j) { while (L1 <= R1 && j - q1[L1] + 1 > k) L1 ++; while (L1 <= R1 && U[x][q1[R1]] >= U[x][j]) R1 --; q1[++R1] = j; while (L2 <= R2 && j - q2[L2] + 1 > k) L2 ++; while (L2 <= R2 && D[x][q2[R2]] >= D[x][j]) R2 --; q2[++R2] = j; if (j >= k && U[x][q1[L1]] + D[x][q2[L2]] - 1 >= k) { Ans = k; return true; } } return false; } void Change(int x,int y) { a[x][y] = '.'; for (int i=x; i<=n; ++i) U[i][y] = a[i][y] == '.' ? U[i-1][y] + 1 : 0; for (int i=x; i>=1; --i) D[i][y] = a[i][y] == '.' ? D[i+1][y] + 1 : 0; } int main() { n = read(), m = read(); int Q = read(); for (int i=1; i<=n; ++i) scanf("%s",a[i]+1); for (int i=1; i<=Q; ++i) { x[i] = read(),y[i] = read(); a[x[i]][y[i]] = 'X'; } solve(); for (int i=Q; i>=1; --i) { ans[i] = Ans; Change(x[i], y[i]); while (update(x[i], Ans + 1)); } for (int i=1; i<=Q; ++i) printf("%d\n",ans[i]); return 0; }
相关文章推荐
- Codeforces 480.E Parking Lot
- CF 135 E.Parking Lot(线段树)
- Codeforces#135(div.2) E.Parking lot【线段树】
- Amazon Interview Question: Design an OO parking lot
- Parking-lot
- 在Scrum中忽视了Parking Lot List
- Codeforces Round #135 (Div. 2) E. Parking Lot 线段数区间合并
- (CF) D. A Lot of Games
- CF 455B(A Lot of Games-树上博弈)
- 3.Parking Lot Simulation
- CF 260 DIV2 D. A Lot of Games(字典树+博弈)
- #OOD#Parking Lot停车场设计
- CF 455B-- A Lot of Games
- CF 579A (二进制拆分)
- 【CF】7 Beta Round D. Palindrome Degree
- cf#309-B. Ohana Cleans Up-排序水题
- cf 状压dp Little Pony and Harmony Chest
- ocp-480
- cf 3a Shortest path of the king
- cf 17a Noldbach problem