Submission
Status:
(PPPPPP)(PPPPPP)(PPPPPP)(PPPPPPPP)(PPPPPP)(PPPPPPPPPPPPP)
Subtask/Task Score:
{13/13}{11/11}{10/10}{16/16}{18/18}{32/32}
Score: 100
User: nozmid
Problemset: Tech Sprites
Language: cpp
Time: 1.389 second
Submitted On: 2025-06-08 04:32:49
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast", "unroll-loops")
#pragma GCC target("avx2")
using namespace std;
#define emb emplace_back
#define em emplace
#define pb push_back
#define ph push
struct stc{
int a, b, g;
bool operator<(const stc &x) const{
if(a != x.a) return a < x.a;
return b < x.b;
}
};
struct DSU{
vector<int> pa, sz, gr;
DSU(int n){
pa.resize(n);
sz.assign(n, 1);
gr.resize(n);
iota(pa.begin(), pa.end(), 0);
}
int findset(int u){
if(pa[u] == u) return u;
return pa[u] = findset(pa[u]);
}
void unite(int u, int v){
u = findset(u);
v = findset(v);
if(u == v) return;
if(sz[v] > sz[u]) swap(u, v);
gr[u] += gr[v];
sz[u] += sz[v];
pa[v] = u;
}
};
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
int n, m;
cin >> n >> m;
DSU dsu(n+1);
stc tech[n+1];
vector<int> adj[n+1];
bool vis[n+1] = {};
queue<int> qu;
for(int i=1;i<=n;++i){
cin >> tech[i].a >> tech[i].b;
}
for(int i=0;i<m;++i){
int u, v;
cin >> u >> v;
adj[u].emb(v);
adj[v].emb(u);
}
int cnt = 0;
for(int i=1;i<=n;++i){
if(vis[i]) continue;
++cnt;
vis[i] = 1;
qu.em(i);
while(!qu.empty()){
int u = qu.front();
qu.pop();
tech[u].g = cnt;
++dsu.gr[cnt];
for(int v : adj[u]){
if(!vis[v]){
vis[v] = 1;
qu.em(v);
}
}
}
}
sort(tech+1, tech+n+1);
int tmp = tech[1].g, res = 0;
for(int i=1;i<=n;++i){
int g = tech[i].g;
if(!dsu.gr[tmp]) tmp = g;
if(dsu.findset(tmp) != dsu.findset(g)){
dsu.unite(tmp, g);
++res;
}
--dsu.gr[tmp];
}
cout << res;
}