Description

了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的 时候有一个独一无二的位置坐标Xi,Yi(l≤Xi,Yi≤[1..10^9];Xi,Yi∈整数.当满足下列两个条件之一,两只奶牛i和j是属于同一个 群的:
  1.两只奶牛的曼哈顿距离不超过C(1≤C≤10^9),即lXi - xil+IYi - Yil≤C.
  2.两只奶牛有共同的邻居.即,存在一只奶牛k,使i与k,j与k均同属一个群.
    给出奶牛们的位置,请计算草原上有多少个牛群,以及最大的牛群里有多少奶牛

Input

第1行输入N和C,之后N行每行输入一只奶牛的坐标.

Output

仅一行,先输出牛群数,再输出最大牛群里的牛数,用空格隔开.

Sample Input

4 2
1 1
3 3
2 2
10 10

* Line 1: A single line with a two space-separated integers: the
number of cow neighborhoods and the size of the largest cow
neighborhood.

Sample Output

2 3

OUTPUT DETAILS:
There are 2 neighborhoods, one formed by the first three cows and
the other being the last cow. The largest neighborhood therefore
has size 3.

HINT

Source

【思路】

Set+并查集

曼哈顿距离分为以下情况

    X-x+Y-y -> (X+Y)-(x+y)

    X-x+y-Y -> (X-Y)-(x-y)  

    x-X+Y-y -> -( (X-Y)-(x-y) )  

    x-X+y-Y -> -( (X+Y)-(x+y) )

  这四种情况,我们可以发现,答案就是

    max( |(X+Y)-(x+y)|, |(X-Y)-(x-y)| )

  于是把每个点变为(x+y,x-y) 并将x从小到大排序

  维护一个队列使得front~i区间x坐标的差均小于c

  用set维护队列元素中的y,如果i在set中的前驱或后继与i的y之差小于c则合并集合。

【代码】

  1. #include<set>
  2. #include<cstdio>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. typedef long long LL;
  8. const int N = 1e5+;
  9. const int INF = 1e9+1e9+;
  10. struct Node{
  11. int x,y;
  12. bool operator < (const Node& rhs) const{
  13. return x<rhs.x;
  14. }
  15. }a[N];
  16. int n,c,p[N],sum[N],ans,mx;
  17. multiset<Node> S;
  18. multiset<Node> ::iterator it;
  19.  
  20. int ifind(int u) {
  21. return u==p[u]? u:p[u]=ifind(p[u]);
  22. }
  23. void unit(int x,int y) {
  24. x=ifind(x),y=ifind(y); if(x!=y) p[x]=y;
  25. }
  26.  
  27. void read(int& x) {
  28. char c=getchar(); int f=; x=;
  29. while(!isdigit(c)){if(c=='-')f=-; c=getchar();}
  30. while(isdigit(c)) x=x*+c-'',c=getchar();
  31. x*=f;
  32. }
  33. int main() {
  34. read(n),read(c);
  35. for(int i=;i<=n;i++) p[i]=i;
  36. int x,y;
  37. for(int i=;i<=n;i++) {
  38. read(x),read(y);
  39. a[i].x=x+y,a[i].y=x-y;
  40. }
  41. sort(a+,a+n+);
  42. S.insert((Node){INF,}),S.insert((Node){-INF,});
  43. int front=;
  44. for(int i=;i<=n;i++) {
  45. while(a[i].x-a[front].x>c) {
  46. S.erase(S.lower_bound((Node){a[front].y,front}));
  47. ++front;
  48. }
  49. it=S.lower_bound((Node){a[i].y,i});
  50. Node r=*it,l=*(--it);
  51. if((LL)r.x-(LL)a[i].y<=c) unit(r.y,i);
  52. if((LL)a[i].y-(LL)l.x<=c) unit(l.y,i);
  53. S.insert((Node){a[i].y,i});
  54. }
  55. for(int i=;i<=n;i++) {
  56. sum[ifind(i)]++;
  57. if(sum[ifind(i)]==) ans++;
  58. }
  59. for(int i=;i<=n;i++) mx=max(mx,sum[i]);
  60. printf("%d %d",ans,mx);
  61. return ;
  62. }

bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)的更多相关文章

  1. BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

    题目 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Time Limit: 5 Sec  Memory Limit: 64 MB Description ...

  2. 【BZOJ1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap+并查集

    [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000) ...

  3. bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居——排序+贪心+set

    Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l ...

  4. BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1604 题意: 平面直角坐标系中,有n个点(n <= 100000,坐标范围10^9) ...

  5. bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 曼哈顿生成树

    大致题意:统计平面上由曼哈顿距离小于等于c的点对组成联通块的个数. 曼哈顿生成树的模板题.有关讲解:http://blog.csdn.net/acm_cxlove/article/details/88 ...

  6. bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居【切比雪夫距离+并查集+multiset】

    参考:http://hzwer.com/4361.html 坐标开long long,inf开大点 先曼哈顿转切比雪夫(x+y,x-y),距离就变成了max(x',y'): 先按x排序,维护两个指针, ...

  7. BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap

    题意:链接 方法: Treap 解析: 前几道资格赛的题水的不行,这道Gold的题就够分量辣. 首先这个曼哈顿距离啥的肯定能做文章,怎么转化是个问题,自己玩了一会没玩出来,就查了查曼哈顿距离的转化,发 ...

  8. 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1604 这题太神了... 简直就是 神思想+神做法+神stl.. 被stl整的我想cry...首先,, ...

  9. 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

    [算法]并查集+平衡树+数学+扫描线 [题解] 经典曼哈顿距离转切比雪夫距离. 曼哈顿距离:S=|x1-x2|+|y1-y2|<=c 即:max(x1-x2+y1-y2,x1-x2-y1+y2, ...

随机推荐

  1. 暑假集训(1)第八弹 -----简单迷宫(Poj3984)

    Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ...

  2. 理解Http协议(一)

    本文对Http协议进行了简要的描述,说明了其用途的广泛性:通过代码对Http连接和Http请求消息的发送进行实现,希望能将这些抽象的过程直观的显示出来:最后对HttpURL和Http协议中“资源”这些 ...

  3. python 自动化之路 day 07 面向对象基础

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.   面向对象编程 OOP编程是利用"类"和"对象" ...

  4. docker私有仓库

    1.docker pull registry 2.sudo docker run -d -p 5000:5000 registry 默认情况下,会将仓库存放于容器内的/tmp/registry目录下, ...

  5. Traveller数据访问路径

    2015年10月数据访问路径

  6. c#集合解析

    什么是集合(collection)? 提供了一种结构化组织任意对象的方式,从.NET 的角度看,所谓的集合可以定义为一种对象,这种对象实现一个或者多个System.Collections.IColle ...

  7. PHP - php汉字转拼音

    php汉字转拼音 php函数(由dedecms(dedecms/include/inc/inc_fun_funAdmin.php)的SpGetPinyin函数修改,dedecms的字典不太完全): & ...

  8. linux服务器监控流量sh脚本

    服务器可能经常遇到服务器出带宽跑满,不知如何查询被哪个进程占用的情况,有一款开源的英文软件iftop功能比较强大可以查询相关信息,可能刚接触linux系统的朋友不太会使用,在此写了一个功能比较简单无需 ...

  9. 15个Docker基本命令及用法

    Docker入门教程:15个Docker基本命令及用法   本文中,我们将学习15个Docker命令以及命令的用法和功能,并通过实践学习它是如何工作的. AD:51CTO 网+ 第十二期沙龙:大话数据 ...

  10. uva 11168 - Airport

    凸包+一点直线的知识: #include <cstdio> #include <cmath> #include <cstring> #include <alg ...