Untitled
unknown
c_cpp
a year ago
3.0 kB
5
Indexable
#include <bits/stdc++.h> using namespace std; stack<pair<int, int>> q; stack<pair<int, int>> ans; struct DSU { int cnt, max_size; vector<int> parent, size; DSU( int n ) { parent.resize( n + 1 ), size.resize( n + 1 ); for ( int i = 0; i <= n; i++ ) parent[i] = i, size[i] = 1; cnt = n, max_size = 1; } int find_root( int u ); bool unite( int u, int v ); }; int DSU::find_root( int u ) { return ( u == parent[u] ? u : parent[u] = find_root( parent[u] ) ); } bool DSU::unite( int u, int v ) { int ru = find_root(u); int rv = find_root(v); if ( ru == rv ) return false; if ( size[ru] < size[rv] ) swap( u, v ); size[ru] += size[rv]; parent[rv] += ru; cnt--; max_size = max( max_size, size[ru] ); return true; } void solve( DSU &dsu, vector<vector<int>> &arr, int n, int m ) { for ( int i = 0; i < n; i++ ) { for ( int j = 0; j < m; j++ ) { if ( arr[i][j] == 0 ) continue; else if ( i != n - 1 ) { if ( j != m - 1 ) { if ( arr[i][j + 1] != 0 ) dsu.unite( arr[i][j], arr[i][j + 1] ); if ( arr[i + 1][j] != 0 ) dsu.unite( arr[i][j], arr[i + 1][j] ); } else { if ( arr[i + 1][j] != 0 ) dsu.unite( arr[i][j], arr[i + 1][j] ); } } else if ( i == n - 1 ) { if ( j != m - 1 ) { if ( arr[i][j + 1] != 0 ) dsu.unite( arr[i][j], arr[i][j + 1] ); } } else continue; } } ans.push( make_pair( dsu.max_size, dsu.cnt ) ); } int main() { ios::sync_with_stdio(), cin.tie(0), cout.tie(0); int n, m, k, t = 0; cin >> n >> m >> k; vector<int> row(m); vector<vector<int>> arr(n, row); for ( int i = 0; i < n; i++ ) { for ( int j = 0; j < m; j++ ) { int x; cin >> x; if ( x == 0 ) continue; t += 1; arr[i][j] = t; } } int z = t; for ( int i = 0; i < k; i++ ) { int x, y; cin >> x >> y; q.push( make_pair(x, y) ); arr[x - 1][y - 1] = 0; z--; } for ( int i = 0; i < k + 1; i++ ) { DSU my_dsu( z ); if ( i == 0 ) { solve( my_dsu, arr, n, m ); } else { arr[q.top().first - 1][q.top().second - 1] = 1; q.pop(); solve( my_dsu, arr, n, m ); } z++; } for ( int i = 0; i < k + 1; i++ ) { cout << ans.top().first << " " << ans.top().second << "\n"; ans.pop(); } }
Editor is loading...
Leave a Comment