题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1604

题意:

  平面直角坐标系中,有n个点(n <= 100000,坐标范围10^9)。

  给定r,当两个点的曼哈顿距离<=r时,认为这两个点在同一个“群”中。

  问你共有多少个群,以及点的数量最多的群有多少个点。

题解:

  本题的核心在于:如何枚举一个点周围满足“曼哈顿距离<=r”的点。

  由于 曼哈顿距离 = |x1 - x2| + |y1 - y2|。

  x和y相互影响,不能单纯按x或y排序,枚举所有点总复杂度为O(N^2)。

  所以要用到曼哈顿距离的另一种形式:

    设X = x + y , Y = x - y

    d(曼哈顿距离) = max(|X1-X2|, |Y1-Y2|)

  将每个点的X = x + y,Y = x - y,这就将X与Y的关系分离开了。

  

  将所有点按X排序。

  当前考虑到点i。

  用一个队列(X升序),保证队列中的所有X满足要求,否则不断删去队首。

  用一个multiset(Y升序),找到i的前驱pre和后继suc,如果i与pre(或suc)的Y满足要求,则合并(并查集)。

  最后统计一下每个群就好了。

AC Code:

  1. // |x1-x2| + |y1-y2|
  2. // | (x1+y1) - (x2+y2) |
  3. // | (x1-y1) - (x2-y2) |
  4. // X = x + y
  5. // Y = x - y
  6. // d = max(|X1-X2|, |Y1-Y2|) <= r
  7. #include <iostream>
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <algorithm>
  11. #include <set>
  12. #define MAX_N 100005
  13. #define INF 100000000
  14.  
  15. using namespace std;
  16.  
  17. struct Coor
  18. {
  19. int x;
  20. int y;
  21. int idx;
  22. Coor(int _x,int _y,int _idx)
  23. {
  24. x=_x;
  25. y=_y;
  26. idx=_idx;
  27. }
  28. Coor(){}
  29. friend bool operator < (const Coor &a,const Coor &b)
  30. {
  31. return a.y!=b.y?a.y<b.y:a.idx<b.idx;
  32. }
  33. };
  34.  
  35. int n,r;
  36. int ans=;
  37. int counter=;
  38. int head=;
  39. int par[MAX_N];
  40. int cnt[MAX_N];
  41. Coor c[MAX_N];
  42. multiset<Coor> mst;
  43.  
  44. inline bool cmp_x(const Coor &a,const Coor &b)
  45. {
  46. return a.x<b.x;
  47. }
  48.  
  49. void init_union_find()
  50. {
  51. for(int i=;i<n;i++)
  52. {
  53. par[i]=i;
  54. }
  55. }
  56.  
  57. int find(int x)
  58. {
  59. return par[x]==x?x:par[x]=find(par[x]);
  60. }
  61.  
  62. void unite(int x,int y)
  63. {
  64. int px=find(x);
  65. int py=find(y);
  66. if(px==py) return;
  67. par[px]=py;
  68. }
  69.  
  70. void read()
  71. {
  72. cin>>n>>r;
  73. int a,b;
  74. for(int i=;i<n;i++)
  75. {
  76. cin>>a>>b;
  77. c[i].x=a+b;
  78. c[i].y=a-b;
  79. c[i].idx=i;
  80. }
  81. }
  82.  
  83. void solve()
  84. {
  85. init_union_find();
  86. sort(c,c+n,cmp_x);
  87. mst.insert(Coor(,INF,));
  88. mst.insert(Coor(,-INF,));
  89. mst.insert(c[head]);
  90. for(int i=;i<n;i++)
  91. {
  92. while(c[i].x-c[head].x>r)
  93. {
  94. mst.erase(c[head]);
  95. head++;
  96. }
  97. multiset<Coor>::iterator it=mst.lower_bound(c[i]);
  98. Coor suc=*it;
  99. Coor pre=*--it;
  100. if(c[i].y-pre.y<=r) unite(pre.idx,c[i].idx);
  101. if(suc.y-c[i].y<=r) unite(suc.idx,c[i].idx);
  102. mst.insert(c[i]);
  103. }
  104. memset(cnt,,sizeof(cnt));
  105. for(int i=;i<n;i++)
  106. {
  107. int p=find(i);
  108. if(cnt[p]==) counter++;
  109. cnt[p]++;
  110. ans=max(ans,cnt[p]);
  111. }
  112. }
  113.  
  114. void print()
  115. {
  116. cout<<counter<<" "<<ans<<endl;
  117. }
  118.  
  119. int main()
  120. {
  121. read();
  122. solve();
  123. print();
  124. }

BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】的更多相关文章

  1. bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)

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

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

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

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

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

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

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

  5. 【bzoj1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 旋转坐标系+并查集+Treap/STL-set

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

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

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

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

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

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

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

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

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

随机推荐

  1. Solidworks如何生成爆炸图

    1 自动爆炸 点击"爆炸视图"按钮,然后全部选中装配体(被选中的零件会变为蓝色,全部选中即全部变色)然后在组成偶尔的爆炸窗口中下拉,点击应用.   再点击完成   回到装配体面板, ...

  2. http Keep-Alive

    1.什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTT ...

  3. redis安装报错

    错误原因大概是这个: creating server tcp listening socket 127.0.0.1:6379: bind No error 解决方案如下按顺序输入如下命令就可以连接成功 ...

  4. 12306 外包给阿里巴巴、IBM 等大企业做是否可行?

    知乎上看到的,转载过来,雅俗共赏 12306首秀被骂的狗血喷头后铁道部找来IBM.阿里巴巴等大企业要解决方式,给出的条件是资金管够可是问题得解决. 几大企业最后都拒绝了(当中阿里巴巴最后负责了排队系统 ...

  5. hdu 2063过山车

    二分匹配 #include<iostream> #include<cstring> using namespace std; int k,m,n; int rem[500+5] ...

  6. 基于jenkins,tekton等工具打造kubernetes devops平台

    本贴为目录贴,将不断更新 目录 1.Docker在centos下安装以及常见错误解决 2.使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像) 3.无法访问gcr ...

  7. 多媒体开发之---h264 高度和宽度获取

    ( School of Computer Science & Technology, Soochow University,SuZhou 215006:) Abstract: H.264 is ...

  8. 访问一个绝对地址把一个整型数强制转换 (typecast)为一个指针是合法的

    在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66.编译器是一个纯粹的ANSI编译器.写代码去完成这一任务. 解析:这一问题测试你是否知道为了访问一个绝对地址把一个整型数强制转换 ...

  9. Vue引入js、css文件

    1.js调用方法一:这是组件内调用,非公共js 2.js调用方法二:公共jsmain.js内加入公共jsVue.prototype.timeago = timeago 3.引入公共css在main.j ...

  10. 九度OJ 1018:统计同成绩学生人数 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8807 解决:4651 题目描述: 读入N名学生的成绩,将获得某一给定分数的学生人数输出. 输入: 测试输入包含若干测试用例,每个测试用例的 ...