1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #include <bits/stdc++.h>
const int kMaxN = 2e3 + 5;
int n, m, k, ans; int x[kMaxN], y[kMaxN], res[kMaxN], len[kMaxN][kMaxN]; std::string str[kMaxN]; std::vector<std::pair<int16_t, int16_t>> pos[kMaxN];
struct Node { int16_t len, lx, rx, mx; Node(int16_t _len = 0, int16_t _lx = 0, int16_t _rx = 0, int16_t _mx = 0) : len(_len), lx(_lx), rx(_rx), mx(_mx) {} friend Node operator +(const Node &a, const Node &b) { static Node ret; ret.len = a.len + b.len; ret.mx = std::max<int16_t>({a.mx, b.mx, a.rx + b.lx}); if (a.lx == a.len) ret.lx = a.len + b.lx; else ret.lx = a.lx; if (b.rx == b.len) ret.rx = b.len + a.rx; else ret.rx = b.rx; return ret; } };
struct SGT { Node t[kMaxN * 4]; void pushup(int x) { t[x] = t[x << 1] + t[x << 1 | 1]; } void build(int x, int l, int r) { if (l == r) return void(t[x] = {1, 0, 0, 0}); int mid = (l + r) >> 1; build(x << 1, l, mid), build(x << 1 | 1, mid + 1, r); pushup(x); } void update(int x, int l, int r, int ql, int v) { if (l == r) return void(t[x] = {1, v, v, v}); int mid = (l + r) >> 1; if (ql <= mid) update(x << 1, l, mid, ql, v); else update(x << 1 | 1, mid + 1, r, ql, v); pushup(x); } } sgt[kMaxN];
void prework() { ans = std::max(n, m) + 1; for (int i = 1; i <= m; ++i) sgt[i].build(1, 1, n); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (str[i][j] == 'X') len[i][j] = 0; else len[i][j] = len[i][j - 1] + 1; pos[len[i][j]].emplace_back(i, j); } } }
void upd(int x, int y, int v) { pos[len[x][y] = v].emplace_back(x, y); sgt[y].update(1, 1, n, x, v >= ans); }
bool check() { for (int i = 1; i <= m; ++i) if (sgt[i].t[1].mx >= ans) return 1; return 0; }
void fix() { for (; !check(); --ans) { assert(ans); for (auto [x, y] : pos[ans - 1]) if (len[x][y] == ans - 1) sgt[y].update(1, 1, n, x, 1); } }
void update(int x, int y) { for (int i = y; i <= m; ++i) { if (str[x][i] == 'X') break; upd(x, i, i - y); } str[x][y] = 'X', fix(); }
void dickdreamer() { std::cin >> n >> m >> k; for (int i = 1; i <= n; ++i) { std::cin >> str[i]; str[i] = " " + str[i]; } prework(); for (int i = 1; i <= k; ++i) { std::cin >> x[i] >> y[i]; if (str[x[i]][y[i]] != 'X') update(x[i], y[i]); std::cout << ans << '\n'; } }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|