Untitled

 avatar
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