记录编号 167833 评测结果 AAAAAAAAAAAAAAA
题目名称 [USACO Open08]牛的邻居 最终得分 100
用户昵称 GravatarChenyao2333 是否通过 通过
代码语言 C++ 运行时间 1.613 s
提交时间 2015-06-29 10:23:06 内存使用 7.18 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#define CL(x) memset(x,0,sizeof(x))
#define rep(i,s,t) for(int i=(s);i<=(t);i++)
using namespace std;
typedef long long LL;
int read(){
    int ret=0,f=1;
    char x=getchar();
    while(!(x>='0' && x<='9')){if(x=='-')f=-1;x=getchar();}
    while(x>='0' && x<='9') ret=ret*10+x-'0', x=getchar();
    return ret*f;
}
 
const int MAXN=100000+10;
const int INF=1e9;
 
struct data{
    int x,y;
    int sum;
    int id;
    data(){ x=y=id=sum=0; }
    bool operator < (const data & d)const{
        if(!d.id) return false;
        if(sum!=d.sum) return sum<d.sum;
        if(x!=d.x) return x<d.x;
        return d.y<d.y;
    }
}ds[MAXN];
bool cmpx(const data & a,const data & b){
    if(a.x!=b.x) return a.x<b.x;
    else return a.y<b.y;
}
LL X[MAXN],Y[MAXN];
LL x_ren[MAXN],y_ren[MAXN];
int N,C;
 
struct union_find_set{
    int fa[MAXN];
    void init(){ rep(i,0,MAXN-1) fa[i]=i; }
    union_find_set(){ init(); }
    int get_fa(int n){
        if(n!=fa[n]) fa[n]=get_fa(fa[n]);
        return fa[n];
    }
    bool uni(int a,int b){
        int af=get_fa(a);
        int bf=get_fa(b);
        if(af==bf) return false;
        fa[af]=bf;
        return true;
    }
}ufs;
int dis(const data & a,const data & b){
    return abs(X[a.id]-X[b.id]) + abs(Y[a.id]-Y[b.id]);
}
struct tree_arr{
    data a[MAXN];
    void init(){
        rep(i,0,MAXN-1) a[i]=data();
    }
    int lowbit(int n){ return n&-n; }
    void set(int p,data d){
        while(p<MAXN){
            if(a[p].id && dis(a[p],d)<=C) ufs.uni(a[p].id,d.id);
            a[p]=max(a[p],d);
            p+=lowbit(p);
        }
    }
    data get(int p){
        data ret;
        while(p){
            if(a[p].id && ret.id && dis(a[p],ret)<=C) ufs.uni(a[p].id,ret.id);
            ret=max(a[p],ret);
            p-=lowbit(p);
        }
        return ret;
    }
}at;
 
 
void cal_edge(){
    at.init();
    sort(ds+1,ds+1+N,cmpx);
    rep(i,1,N) ds[i].sum=X[ds[i].id] +Y[ds[i].id];
    rep(i,1,N){
        data d=at.get(ds[i].y);
        if(dis(d,ds[i])<=C) ufs.uni(ds[i].id,d.id);
        at.set(ds[i].y,ds[i]);
    }
}
 
void reverse_y(){
    rep(i,1,N) Y[i]=INF-Y[i]+1;
    rep(i,1,N) ds[i].y=Y[ds[i].id], y_ren[i]=ds[i].y;
    sort(y_ren+1,y_ren+1+N);
    rep(i,1,N) ds[i].y=lower_bound(y_ren+1,y_ren+1+N,ds[i].y)-y_ren;
}
 
void init(){
    N=read(), C=read();
    rep(i,1,N) ds[i].x=X[i]=read(), ds[i].y=Y[i]=read(), ds[i].id=i;
 
    reverse_y();
    cal_edge();
     
    reverse_y();
    cal_edge();
}
 
int sz[MAXN];
void work(){
    int num=0,mx_sz=0;
    rep(i,1,N){
        int f=ufs.get_fa(i);
        if(!sz[f]) num++;
        sz[f]++;
        mx_sz=max(mx_sz,sz[f]);
    }
    printf("%d %d\n",num,mx_sz);
}
 
int main(){
	freopen("nabor.in", "r", stdin);
	freopen("nabor.out", "w", stdout);
    init();
    work();
    return 0;
}