出题人题解 | #动态连通块#

动态连通块

https://ac.nowcoder.com/acm/problem/22578

原题解链接:https://ac.nowcoder.com/discuss/153563

并查集+bitset+bitset优化。

操作二可以在加边的过程中求出。即加入一条端点同色的边,并查集判断是否可以消去一个白(黑)连通块。

操作三求的是x,yx,y所在的两个白连通块都连出的黑点(假设x,yx,y是白色,黑色的情况是一样的)。

于是可以bitsetbitset维护每个白联通块连出的黑点,黑连通块连出的白点。每加入一条端点异色的边,在两个白、黑连通块的bitsetbitset中将一个位置设为11;加入一条端点同色的边,就是合并白(黑)连通块的过程,同时合并两个白(黑)连通块的bitsetbitset

复杂度 O(n2W),W=32O\left(\begin{array}{l}n^{2} \\ W\end{array}\right), \quad \mathrm{W}=32 或 64

#include<cstdio>
#include<iostream>
#include<bitset>
using namespace std;

const int N = 50005;
bitset<N> f[N], g;
int fa[N], col[N], ans0, ans1, tot0, tot1;

int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }

void add(int u,int v) {
    if (col[u] == col[v]) {
        u = find(u), v = find(v);
        if (u != v) {
            fa[u] = v;
            f[v] |= f[u];
            if (col[u] == 0) ans0 --;
            else ans1 --;
        }
    }
    else {
		int t1 = find(u), t2 = find(v);
        f[t1].set(v);
        f[t2].set(u);
    }
}
void query1(int x) {
    printf("%d\n", x == 0 ? ans0 : ans1);
}
void query2(int u,int v) {
    u = find(u), v = find(v);
    if (u == v) { 
    	puts("-1");
        return ; 
    }
    g = f[u] & f[v];
    printf("%d\n", g.count());
}
int main() {
    int n, Q, opt, a, b;
    scanf("%d%d", &n, &Q);
    for (int i = 1; i <= n; ++i) {
    	scanf("%d", &col[i]);
    	fa[i] = i;
    	if (col[i] == 0) ans0 ++, tot0 ++;
    	else ans1 ++, tot1 ++;
	}
    while (Q --) {
        scanf("%d", &opt);
        if (opt == 1) {
        	scanf("%d%d", &a, &b);
        	add(a, b);
		}
        else if (opt == 2) {
        	scanf("%d", &a);
        	query1(a);
		}
        else if (opt == 3) {
        	scanf("%d%d", &a, &b);
        	query2(a, b);
		}
    }
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 17:30
点赞 评论 收藏
分享
就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
06-26 15:33
青岛工学院 Java
积极的秋田犬要冲国企:他现在邀请我明天面试
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 14:32
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务