1 条题解
-
0
题目大意:
给定几个被染色的点的位置,如果任意一个矩形内三个角的点已经被染色,就可以免费把剩下一个角染色。问你至少要再加多少个点才能把整个矩形染色。
思路:
题中给定了已染色点的坐标,我们可以把坐标看成将这个位置的横轴和竖轴连一条边。倘若某个点在一个连通块内,那么它就一定可以被免费染色。然后求出连通块的个数,若要把整个矩形拼成一个连通块,就在相邻两个连通块之间建一条边。所以答案就是连通块个数减一。考虑到并查集能维护连通块,所以用并查集。
代码:
#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
- 上传者