1 条题解

  • 0
    @ 2026-5-4 21:06:48

    题目大意:

    给定几个被染色的点的位置,如果任意一个矩形内三个角的点已经被染色,就可以免费把剩下一个角染色。问你至少要再加多少个点才能把整个矩形染色。

    思路:

    题中给定了已染色点的坐标,我们可以把坐标看成将这个位置的横轴和竖轴连一条边。倘若某个点在一个连通块内,那么它就一定可以被免费染色。然后求出连通块的个数,若要把整个矩形拼成一个连通块,就在相邻两个连通块之间建一条边。所以答案就是连通块个数减一。考虑到并查集能维护连通块,所以用并查集。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    using ll=long long;
    const int N=1e6+7;
    int s[N];
    int find(int x){
    	if(s[x]==x) return x;
    	return s[x]=find(s[x]);
    }
    void merge(int x,int y){
    	x=find(x),y=find(y);
    	if(x!=y) s[x]=s[y];
    }
    int main(){
    	int n,m,q;
    	cin>>n>>m>>q;
    	for(int i=1;i<=n+m;i++){
    		s[i]=i;
    	}
    	while(q--){
    		int a,b;
    		cin>>a>>b;
    		b+=n;
    		merge(a,b);
    	}
    	int ans=0;
    	for(int i=1;i<=n+m;i++){
    		if(i==find(i)) ans++;
    	}
    	cout<<ans-1;
    	return 0;
    }
    
    • 1

    信息

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