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: kungarooo

Problemset: Tech Sprites

Language: cpp

Time: 1.463 second

Submitted On: 2025-11-01 14:37:51

#include<bits/stdc++.h>
using namespace std;
int csz=0;
vector<vector<int>> adj(1000001);
tuple<int,int,int> p[1000001];
vector<bool> vis(1000001,false);
void dfs(int node,int& g){
    if(vis[node])return;
    vis[node]=1;
    csz++;
    //cout<<node<<"::\n";
    auto [a,b,gg]=p[node];
    p[node]={a,b,g};
    for(auto i:adj[node]){
        if(vis[i])continue;
        dfs(i,g);
    }
}
int main(){
    ios_base::sync_with_stdio(0),cin.tie(NULL);
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        int u,v;
        cin>>u>>v;
        p[i]={u,v,-1};
    }
    for(int i=0;i<m;i++){
        int u,v;
        cin>>u>>v;
        adj[u-1].push_back(v-1);
        adj[v-1].push_back(u-1);
    }
    int cnt=1;
    vector<int> gsz;
    gsz.push_back(0);
    for(int i=0;i<n;i++){
        auto [a,b,g]=p[i];
        if(g==-1){
            csz=0;
            //cout<<i<<":\n";
            dfs(i,cnt);
            gsz.push_back(csz);
            cnt++;
        }
    }
    int par[cnt]={};
    bool found[cnt]={};
    int ans=0,counter=0;
    for(int i=0;i<cnt;i++){
        par[i]=i;
    }
    sort(p,p+n);
    for(int i=0;i<n;i++){
        auto [a,b,g]=p[i];
        if(counter==0){
            counter+=gsz[g];
            found[g]=1;
            counter--;
            continue;
        }
        if(!found[g]){
            ans++;
            counter+=gsz[g];
            found[g]=1;
        }
        counter--;
    }
    cout<<ans;
    return 0;
}