1 条题解

  • 0
    @ 2023-1-9 10:59:55

    这题一看就联想到搜索,每读入一个点就进行判断,然后把周围的点进行标记,但这只能过 30%60%30\%\sim60\% 的数据,100%100\% 的数据是过不了的,所以就要用到并查集,这样会使得几个本不相连的连通块连在一起时可以根据父节点的判断,将总块数减掉。

    #include <cstdio>
    #include <cstring>
    using namespace std;
    int fa[250005], gr[505][505];
    int dx[] = {1, 0, -1, 0};
    int dy[] = {0, 1, 0, -1};
    int find(int x) {
        if (fa[x] != x) fa[x] = find(fa[x]);
        return fa[x];
    }
    inline int turn(int x, int y, int n) {
        return (x - 1) * n + y;
    } 
    int main() {
        memset(gr, -1, sizeof(gr));
        int n, m, ans = 0;
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n * n; i++)
            fa[i] = i;
        while (m--) {
            int c, x, y;
            scanf("%d%d%d", &c, &x, &y);
            gr[x][y] = c;
            ans++;
            for (int i = 0; i < 4; i++) {
                int xx = x + dx[i], yy = y + dy[i];
                if (gr[xx][yy] == c && find(turn(x, y, n)) != find(turn(xx, yy, n)))
                    fa[find(turn(xx, yy, n))] = find(turn(x, y, n)), ans--;
            }
            printf("%d\n", ans);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    4
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者