Cod sursa(job #3331326)

Utilizator boboc132Boboc Teodor boboc132 Data 26 decembrie 2025 18:16:13
Problema Curcubeu Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

ifstream in("banana.in");
ofstream out("banana.out");

int SZ[16005],T[16005];

struct stare{
    int x;
    int y;
    int id;
}V[16005];

bool cmpX(stare a,stare b){
    if(a.x!=b.x){
        return a.x<b.x;
    }
    return a.y<b.y;
}

bool cmpY(stare a,stare b){
    if(a.y!=b.y){
        return a.y<b.y;
    }
    return a.x<b.x;
}

int get_root(int nod){
    if(T[nod]==nod){
        return nod;
    }
    return T[nod]=get_root(T[nod]);
}

void unite(int x,int y){
    int rx=get_root(x);
    int ry=get_root(y);
    if(SZ[rx]<=SZ[ry]) {
        T[rx]=ry;
        SZ[ry]+=SZ[rx];
    }else{
        T[ry]=rx;
        SZ[rx]+=SZ[ry];
    }
}

int main(){
    int n,k;
    in>>n>>k;
    for(int i=1;i<=n;i++){
        in>>V[i].x>>V[i].y;
        V[i].id=i;
        T[i]=i;
        SZ[i]=1;
    }
    sort(V+1,V+n+1,cmpX);
    for(int i=1;i<n;i++){
        if(V[i].x==V[i+1].x && V[i].y+1==V[i+1].y){
            unite(V[i].id,V[i+1].id);
        }
    }
    sort(V+1,V+n+1,cmpY);
    for(int i=1;i<n;i++){
        if(V[i].y==V[i+1].y && V[i].x+1==V[i+1].x){
            unite(V[i].id,V[i+1].id);
        }
    }
    vector<int>zone;
    for(int i=1;i<=n;i++){
        if(T[i]==i){
            zone.push_back(SZ[i]);
        }
    }
    sort(zone.begin(),zone.end(),greater<int>());
    long long sum=0;
    for(int i=0;i<k && i<(int)zone.size();i++){
        sum+=zone[i];
    }
    out<<sum;
}