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.

—————————————————————————————
这道题首先我们进行一个转化 就是 将每个点变成(sx=(x+y), sy=( x-y))
这样两点的曼哈顿距离就是 max( |sx1 – sx2|, |sy1 – sy2|)=max( x1-x2+y1-y2 ,  x1-x2-y1+y2 )
这个可以分类证明 分四类
1 x1>x2 &&y1>y2 那么 sx1-sx2 就是曼哈顿距离的正常表示方法 且sx1-sx2>sy1-sy2 
2 x1<x2&&y1<y2 因为是绝对值 所以其实形式是一样的 (同上)
3 x1>x2&&y1<y2  那么 |x1-x2|+|y1-y2| = x1-x2+y2-y1 就是 sy1-sy2 也易得 sy1-sy2>sx1-sx2
3 x1>x2&&y2>y1 一样是绝对值 倒一下就好了(同上)
这样之后我们把点按 sx 排序 维护一个队列 对头的坐标和当前点的坐标的sx的差 不能超过 c
因为超过 c 他必然不可能和当前点曼哈顿距离小于c
所以如果超过我们要删除(顺便在平衡树把这个点删了)
然后我们维护一个sy的平衡树 求一下当前点sy在平衡树里面的前驱后继 看一下能不能合并
如果可以就合并在一个并查集  最后扫一波就可以得到答案了
至于为什么可以这么合并 因为就算别的点在前驱的下面或者后继的下面并且他们可以和当前点合并
那么他们一定在之前和前驱后继或者是再前再后合并 所以这样的贪心是可行的
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<set>
  5. #include<queue>
  6. using namespace std;
  7. const int M=;
  8. int read(){
  9. int ans=,f=,c=getchar();
  10. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  11. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  12. return ans*f;
  13. }
  14. int n,c;
  15. int f[M],h[M],ans,mx;
  16. int find(int x){while(f[x]!=x) x=f[x]=f[f[x]]; return x;}
  17. struct node{
  18. int x,y,id;
  19. bool operator <(const node& k)const{return x<k.x;}
  20. }e[M];
  21. struct pos{
  22. int y,id;
  23. bool operator <(const pos& k)const{return y!=k.y?y<k.y:id<k.id;}
  24. };
  25. std::queue<int>q;
  26. std::multiset<pos>tr;
  27. std::multiset<pos>::iterator it;
  28. int main(){
  29. int x,y;
  30. n=read(); c=read();
  31. for(int i=;i<=n;i++){
  32. x=read(); y=read();
  33. f[i]=i; e[i].x=x+y,e[i].y=x-y; e[i].id=i;
  34. }
  35. sort(e+,e++n);
  36. for(int i=;i<=n;i++){
  37. while(!q.empty()&&e[i].x-e[q.front()].x>c){
  38. int now=q.front(); q.pop();
  39. tr.erase(tr.find((pos){e[now].y,e[now].id}));
  40. }
  41. q.push(i);
  42. it=tr.insert((pos){e[i].y,e[i].id});
  43. if(it!=tr.begin()){
  44. --it;
  45. if(e[i].y-(it->y)<=c){
  46. int p=find(e[i].id),q=find(it->id);
  47. f[q]=p;
  48. }
  49. ++it;
  50. }
  51. ++it;
  52. if(it!=tr.end()){
  53. if(it->y-e[i].y<=c){
  54. int p=find(e[i].id),q=find(it->id);
  55. f[q]=p;
  56. }
  57. }
  58. }
  59. for(int i=;i<=n;i++){
  60. int x=find(e[i].id);
  61. if(!h[x]) ans++;
  62. h[x]++; mx=max(mx,h[x]);
  63. }printf("%d %d\n",ans,mx);
  64. return ;
  65. }

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. bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. bzoj 1623: [Usaco2008 Open]Cow Cars 奶牛飞车【排序+贪心】

    从小到大排个序,然后能选就选 #include<iostream> #include<cstdio> #include<algorithm> using names ...

随机推荐

  1. 洛谷P1364 医院设置

    LITTLESUN的第一道图论,撒花~~ 题目链接 这道题是Floyd的板子题 注意对于矩阵图的初始值赋值要全部赋值成最大值 十六进制的最大值表示方式是0x3f3f3f3f memset(G,0x3f ...

  2. 让PC版网站在移动端原样式显示

    一般PC网站在移动端显示效果往往和PC版原样式不同,为了在移动端下还原原PC站样式,可以采用以下方式解决: 1) 去掉页头的: <meta name="viewport" c ...

  3. Spark搭档Elasticsearch

    Spark与elasticsearch结合使用是一种常用的场景,小编在这里整理了一些Spark与ES结合使用的方法.一. write data to elasticsearch利用elasticsea ...

  4. 树莓派搭建 Hexo 博客(一)

    Hexo 一个开源的博客框架,本文记录了一下在树莓派上搭建 Hexo 博客的过程. 什么是 Hexo? Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解 ...

  5. [leetcode-652-Find Duplicate Subtrees]

    Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only ne ...

  6. 关于ubuntu上无法运行cmd markdown

    环境:ubuntu18.04 直接解压完的cmd markdown,直接点击可执行文件运行,没有反应,在通过终端运行,提示:Cannot find required executable ifconf ...

  7. mac tomcat: error 1 operation not permitted

    在用微信传一个tomcat压缩包到别人后,解压后无法用idea启动,提示 error 1 operation not permitted,但是直接用命令可以执行. 仔细查看,原来是因为mac出于安全考 ...

  8. Socket常见错误代码与描述

    最近程序 出现 几次 Socket 错误, 为了便于 差错.. 搜了一些 贴在这里.. 出现网络联机错误Socket error #11001表示您的计算机无法连上服务器,请检查您的Proxy设定以及 ...

  9. BZOJ4327 JSOI2012玄武密码(AC自动机)

    当然可以在SA上二分答案,但看起来会被卡log.考虑对模板串建出AC自动机,用母串在上面跑,标记上所有能到达的点.注意到达某个点时需要标记所有其通过fail指针可以走到的点,如果遇到一个标记过的点就可 ...

  10. hdu6097 Mindis(几何)

    题解: 这里是用解析解的做法, 我们发现如果以P和Q做椭圆,那么当椭圆与圆相切的时候,答案最优 那么方程就是这样的 联立之后,解delta等于0,可以得到 答案就是2a了 注意不一定任何情况都有解,当 ...