Pagini recente » Cod sursa (job #2595303) | Cod sursa (job #1278070) | Cod sursa (job #2337078) | Cod sursa (job #1882092) | Cod sursa (job #3331326)
#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;
}