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: Dormon
Problemset: Tech Sprites
Language: cpp
Time: 0.730 second
Submitted On: 2025-05-27 21:42:08
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
using pii = pair<int, int>;
vector<int> pa;
struct A {
int a, b, i;
bool operator < (const A &o) const {
if (a != o.a) return a < o.a;
return b < o.b;
}
};
class DSU {
public:
vector<int> pa, sz;
int n;
DSU(int n){
pa.resize(n + 1);
sz.assign(n + 1, 1);
this->n = n + 1;
iota(pa.begin(), pa.end(), 0);
}
int f(int i){
if (pa[i] == i) return i;
return pa[i] = f(pa[i]);
}
bool untie(int u, int v){
int fu = f(u), fv = f(v);
if (fu == fv) return false;
if (sz[fu] > sz[fv]) swap(fu, fv);
pa[fu] = fv;
sz[fv] += sz[fu];
sz[fu] = 0;
return true;
}
};
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
DSU dsu(n);
vector<A> v(n + 1);
for (int i = 1;i <= n;i++){
int a, b;
cin >> a >> b;
v[i] = {a, b, i};
}
sort(v.begin() + 1, v.end());
for (int i = 0;i < m;i++){
int u, v;
cin >> u >> v;
dsu.untie(u, v);
}
int ans = 0;
for (int i = 0;i < n - 1;i++){
int compo = dsu.f(v[i].i), ncompo = dsu.f(v[i + 1].i);
dsu.sz[compo]--;
if (compo != ncompo){
ans += (dsu.sz[compo] != 0);
dsu.untie(compo, ncompo);
}
}
cout << ans << '\n';
}