Submission
Status:
(PPPPPP)(PPPPPP)(xxxxxx)(PPPPPPPP)(xxxPxx)(xxxxxxxxxxxxx)
Subtask/Task Score:
{13/13}{11/11}{0/10}{16/16}{0/18}{0/32}
Score: 40
User: njoop
Problemset: Tech Sprites
Language: cpp
Time: 0.382 second
Submitted On: 2025-05-23 17:53:55
#include <bits/stdc++.h>
#define pb push_back
#define pii pair<int,int>
#define f first
#define s second
#define MAXN 200005
#define MOD (int)(1e9+7)
#define INF (int)1e17
#define enl '\n'
#define int long long
#define DB(code) cout<<'\t'<<code<<'\n';
#define SP <<' '<<
using namespace std;
int par[MAXN],sz[MAXN];
int root(int cur){
return par[cur]=(par[cur]==cur)?cur:root(par[cur]);
}
void join(int a,int b){
if(sz[a]>=sz[b]){
par[b]=a;
sz[a]+=sz[b];
} else{
par[a]=b;
sz[b]+=sz[a];
}
}
int n,m;
int arr[MAXN];
vector<int> graph[MAXN];
vector<int> cmp;
bool vis[MAXN];
void dfs(int cur){
cmp.pb(arr[cur]);
vis[cur]=true;
for(auto v: graph[cur]) if(!vis[v]) dfs(v);
}
signed main(){
int u,v;
cin >> n >> m;
for(int i=0; i<n; i++){
cin >> u >> v;
arr[i]=(u-1)*(int)1e9+(v-1);
}
for(int i=0; i<m; i++){
cin >> u >> v;
u--; v--;
graph[u].pb(v);
graph[v].pb(u);
}
vector<pii> num;
vector<int> cmpsz;
int t=0;
for(int i=0; i<n; i++) if(!vis[i]){
cmp.clear();
dfs(i);
cmpsz.pb(cmp.size());
num.pb({cmp[0],t});
for(int j=1; j<cmp.size(); j++) num.pb({cmp[j],t});
t++;
}
sort(num.begin(),num.end());
for(int i=0; i<t; i++){
par[i]=i;
sz[i]=1;
}
int rem=0,now,ans=0;
for(auto p: num){
if(rem==0){
now=p.s;
rem=cmpsz[p.s];
} else{
int a=root(now),b=root(p.s);
if(a!=b){
rem+=cmpsz[p.s];
join(a,b);
ans++;
}
}
rem--;
}
cout << ans;
return 0;
}
/*
5 2
10 20 30 40 50
1 3
2 4
5 1
50 40 30 20 10
1 5
*/