Submission

Status:

(PPPPPP)(PPPPPP)(PPTSSS)(PPPPPPPP)(PPPPPP)(PPPPPPxSSSSSS)

Subtask/Task Score:

{13/13}{11/11}{0/10}{16/16}{18/18}{0/32}

Score: 58

User: pxsit

Problemset: Tech Sprites

Language: cpp

Time: 2.613 second

Submitted On: 2025-07-23 21:36:36

#include <bits/stdc++.h>
using namespace std;
int par[1000005];
int findpar(int u){
    return (u == par[u] ? u : par[u] = findpar(par[u]));
}
int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n,m;
    cin >> n >> m;
    vector<vector<int>> adj(n+1);
    vector<pair<int,int>> tech(n+1);
    vector<vector<pair<int,int>>> cycle(n+1);
    for(int i=1;i<=n;i++){
        par[i] = i;
        int a,b;
        cin >> a >> b;
        tech[i].first = a;
        tech[i].second = b;
        cycle[i].emplace_back(a,b);
    }
    for(int j=0;j<m;j++){
        int u,v;
        cin >> u >> v;
        if(u>v) swap(u,v);
        int pu = findpar(u);
        int pv = findpar(v);
        if(pu != pv){
            // cout << "WE swap PU AND PV AND U AND V " << pu << ' ' << pv << ' ' << u << ' ' << v << '\n';
            par[pu] = pv;
            // cycle[pv] += cycle[pu];
            for(auto i : cycle[pu]) cycle[pv].emplace_back(i);
            // cycle[pv].emplace_back(tech[pu]);
            // cout << "CYC ST\n"; 
            // for(auto i : cycle[pv]) cout << "Cycle "  << i.first << ' ' << i.second << '\n'; 
            // cout << "CYC ND\n"; 
            cycle[pu].clear();
        }
    }
    for(int i=1;i<=n;i++){
        sort(cycle[i].begin(),cycle[i].end());
    }
    vector<pair<pair<int,int>,pair<int,int>>> mp;
    // sort(cycle.begin(),cycle.end());
    // cout << 1;
    for(int i=1;i<=n;i++){
        if(cycle[i].empty()) continue;
        pair<int,int> mn = {0x3f3f3f3f,0x3f3f3f3f},mx = {-1,-1};
        for(auto j : cycle[i]){
            if(j.first < mn.first){
                mn = j;
            }else if(j.first == mn.first){
                if(j.second < mn.second) mn = j;
            }
            if(j.first > mx.first){
                mx = j;
            }else if(j.first == mx.first){
                if(j.second > mx.second) mx = j;
            }
            // cout << "Cycle " << i << " is " << j.first << ' ' << j.second << '\n';
        }
        // if(mx.first == -1) continue;
        mp.emplace_back(mn,mx);
    }
    sort(mp.begin(),mp.end());
    int ans = 0;
    for(int i=1;i<mp.size();i++){
        if(mp[i].first.first < mp[i-1].second.first){
            ans++;
            if(mp[i-1].second.first > mp[i].second.first) mp[i].second = mp[i-1].second;
            if(mp[i].second.first == mp[i-1].second.first) mp[i].second.second = max(mp[i].second.second,mp[i-1].second.second);
        }else if(mp[i].first.first == mp[i-1].second.first){
            if(mp[i].first.second < mp[i-1].second.second){
                ans++;
                if(mp[i-1].second.first > mp[i].second.first) mp[i].second = mp[i-1].second;
                if(mp[i].second.first == mp[i-1].second.first) mp[i].second.second = max(mp[i].second.second,mp[i-1].second.second);
            }
        }
        // cout << mp[i].first.first << ' ' << mp[i].first.second << ' ' << mp[i].second.first << ' ' << mp[i].second.second << '\n';
    }
    cout << ans;
}