Untitled
unknown
c_cpp
2 years ago
3.0 kB
17
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