BZOJ1604【set】

/* I will wait for you */

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<string>

typedef long long LL;
typedef unsigned long long ULL;

using namespace std;

const int maxn=100010;
const int maxm=1010;
const int maxs=26;
const int INF=1<<29;
const int P=1000000007;
const double error=1e-9;

struct node{ int x,y,id; }e[maxn];

bool cmp(node a,node b)
{
	return a.x<b.x;
}

bool operator < (node a,node b)
{
	return a.y<b.y||a.y==b.y&&a.x<b.x;
}

queue<node> q;
multiset<node> s;

int fa[maxn],size[maxn];
int find(int x)
{
	return x==fa[x]?x:fa[x]=find(fa[x]);
}

int main()
{
	int n,c,cnt=0,mx=0;scanf("%d%d",&n,&c);
	for(int i=0,x,y;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		e[i].x=x+y,e[i].y=x-y;e[i].id=i;
	}
	
	sort(e,e+n,cmp); 
	
	s.insert((node){0,INF,-1});
	s.insert((node){0,-INF,-1});
	
	for(int i=0;i<n;i++) fa[i]=i;
	
	for(int i=0;i<n;i++)
	{
		while(!q.empty()&&q.front().x+c<e[i].x) s.erase(q.front()),q.pop();
		
		typeof(s.end()) it=s.lower_bound(e[i]);
		node l=*it,r=*--it;int fu,fv;
		
		if(abs(e[i].y-l.y)<=c)
		{
			fu=find(e[i].id);fv=find(l.id);
			if(fu!=fv) fa[fu]=fv;
		}
		
		if(abs(e[i].y-r.y)<=c)
		{
			fu=find(e[i].id);fv=find(r.id);
			if(fu!=fv) fa[fu]=fv;
		}
		
		q.push(e[i]);s.insert(e[i]);
	}
	
	for(int i=0;i<n;i++) size[find(i)]++;
	for(int i=0;i<n;i++) if(size[i]) cnt++,mx=max(mx,size[i]);
	
	printf("%d %d\n",cnt,mx);
	
	return 0;
}

你可能感兴趣的:(BZOJ1604【set】)