Untitled

 avatar
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