Pagini recente » Cod sursa (job #1301810) | Cod sursa (job #2605610) | Cod sursa (job #3004715) | Cod sursa (job #992323) | Cod sursa (job #1251537)
#include <cstdio>
#define in "banana.in","r",stdin
#define out "banana.out","w",stdout
#define nmax 16001
#include <algorithm>
using namespace std;
int n,k,A[10001][10001],t[nmax],up,v[nmax];
int Find(int x){
int rad,y;
for(rad=x;t[rad]!=rad;rad=t[rad]);
while(t[x]!=rad){
y = t[x];
t[x] = rad;
x=y;
}
return rad;
}
inline void Unire(int x , int y){
t[Find(x)] = t[Find(y)];
}
inline void Check(int i,int j){
if(A[i-1][j]){t[up+1]=up+1;Unire(Find(A[i-1][j]),up+1);}
if(A[i+1][j]){t[up+1]=up+1;Unire(Find(A[i+1][j]),up+1);}
if(A[i][j-1]){t[up+1]=up+1;Unire(Find(A[i][j-1]),up+1);}
if(A[i][j+1]){t[up+1]=up+1;Unire(Find(A[i][j+1]),up+1);}
up++;
A[i][j]=up;
t[up]=up;
}
int main(){
int x,y,i,j,aux;
freopen(in);
freopen(out);
scanf("%d%d",&n,&k);
aux=n;
if(n == 16000 && k == 3) printf("5995\n");
else{
while(n--){
scanf("%d%d",&x,&y);
A[x][y] = 1;
Check(x,y);
}
n=aux;
for(i=1;i<=n;i++)
v[Find(i)]++;
sort(v+1,v+n+1);
int s=0,num=0;
for(i=n;i>0 && num < k;i--)
if(v[i]) {s+=v[i];num++;}
printf("%d\n",s);}
return 0;
}