Untitled
unknown
c_cpp
a year ago
3.3 kB
6
Indexable
#include <iostream> #include <vector> #include <algorithm> #include <stack> #include <utility> using namespace std; struct DSU { int cnt, max_sz; vector<int> parent, sz; DSU(int n) { parent.resize(n + 1), sz.resize(n + 1); for (int i = 1; i <= n; i++) parent[i] = i, sz[i] = 1; cnt = 0; max_sz = 0; } int find_root(int x); void unite(int x, int y); }; int DSU::find_root(int u) { return (u == parent[u] ? u : parent[u] = find_root(parent[u])); } void DSU::unite(int x, int y) { int rx = find_root(x), ry = find_root(y); if (rx == ry) return; cnt--; if (sz[rx] < sz[ry]) swap(rx, ry); parent[ry] = rx; sz[rx] += sz[ry]; max_sz = max(max_sz, sz[rx]); return; } int main() { cin.tie(0); ios::sync_with_stdio(false); int n, m, k; int u, v; cin >> n >> m >> k; vector<vector<int>> arr(n + 2, vector<int>(m + 2, 0)); stack<pair<int, int>> op; stack<pair<int, int>> ans; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { cout << m * (i - 1) + j << endl; cin >> arr[i][j]; } } for (int i = 0; i < k; i++) { cin >> u >> v; arr[u][v] = 0; op.push(make_pair(u, v)); } DSU dsu( n * m ); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (arr[i][j]) { dsu.cnt++; if (arr[i - 1][j] == 0 && arr[i][j - 1] == 0) { dsu.max_sz = 1; } else if (arr[i][j - 1] == 1 && arr[i - 1][j] == 0) { dsu.unite(m * (i - 1) + j - 1, m * (i - 1) + j); } else if (arr[i - 1][j] == 1 && arr[i][j - 1] == 0) { dsu.unite(m * (i - 2) + j, m * (i - 1) + j); } else if (arr[i - 1][j] == 1 && arr[i][j - 1] == 1) { dsu.unite(m * (i - 2) + j, m * (i - 1) + j); dsu.unite(m * (i - 1) + j - 1, m * (i - 1) + j); } } } } ans.push(make_pair(dsu.max_sz, dsu.cnt)); for (int i = 0; i < k; i++) { int u = op.top().first, v = op.top().second; op.pop(); arr[u][v] = 1; dsu.cnt++; if (dsu.max_sz < 1) { /* code */ dsu.max_sz = 1; } if (arr[u][v - 1]) { dsu.unite(m * (u - 1) + v - 1, m * (u - 1) + v); } if (arr[u][v + 1]) { dsu.unite(m * (u - 1) + v + 1, m * (u - 1) + v); } if (arr[u - 1][v]) { dsu.unite(m * (u - 2) + v, m * (u - 1) + v); } if (arr[u + 1][v]) { dsu.unite(m * u + v, m * (u - 1) + v); } ans.push(make_pair(dsu.max_sz, dsu.cnt)); } for (int i = 0; i < k + 1; i++) { cout << ans.top().first << " " << ans.top().second << "\n"; ans.pop(); } return 0; }
Editor is loading...
Leave a Comment