题意:链接

方法: Treap

解析:

前几道资格赛的题水的不行,这道Gold的题就够分量辣。

首先这个曼哈顿距离啥的肯定能做文章,怎么转化是个问题,自己玩了一会没玩出来,就查了查曼哈顿距离的转化,发现这个玩意转化之后就变得有思路多了,所以这数学本领还是非常重要啊=-=

先看曼哈顿距离的定义

|x1−x2|+|y1−y2|

拆绝对值

x1−x2+y1−y2或x1−x2+y2−y1

x2−x1+y1−y2或x2−x1+y2−y1

即|x1+y1−(x2+y2)|或|x1−y1−(x2−y2)|

设x1+y1为x′,x1−y1为y′

则|x1′−x2′|或|y1′−y2′|

所以原要求1转化为

max(|x1′−x2′|,|y1′−y2′|)<=c

这样的二维的东西显然排序一下降一维。

按x’排序后。维护一个x’的队列,再对y’维护一个平衡树即可了。

至于要求2,即是并查集,也就是说平衡树每一次拿出来前驱后继维护下并查集即可。

y’显然可能反复,又维护并查集我们须要拿出来标号。所以平衡树须要多维护一个no,所以再删除的时候我们要找到v与no都跟要删除的目标节点同样的节点删除。

(前驱写挫WA一次= =!

代码:

  1. #include <ctime>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <algorithm>
  7. #define N 100010
  8. using namespace std;
  9. int fa[N];
  10. int q[N];
  11. int tot;
  12. int root;
  13. int cnt[N];
  14. struct node
  15. {
  16. int l,r,w,v,no,rnd,siz;
  17. }tr[N];
  18. void pushup(int rt)
  19. {
  20. tr[rt].siz=tr[tr[rt].l].siz+tr[tr[rt].r].siz+tr[rt].w;
  21. }
  22. void rturn(int &rt)
  23. {
  24. int t=tr[rt].l;
  25. tr[rt].l=tr[t].r;
  26. tr[t].r=rt;
  27. tr[t].siz=tr[rt].siz;
  28. pushup(rt);
  29. rt=t;
  30. }
  31. void lturn(int &rt)
  32. {
  33. int t=tr[rt].r;
  34. tr[rt].r=tr[t].l;
  35. tr[t].l=rt;
  36. tr[t].siz=tr[rt].siz;
  37. pushup(rt);
  38. rt=t;
  39. }
  40. void insert(int &rt,int v,int no)
  41. {
  42. if(!rt)
  43. {
  44. rt=++tot;
  45. tr[rt].siz=1,tr[rt].no=no,tr[rt].rnd=rand();
  46. tr[rt].v=v,tr[rt].w=1;
  47. return;
  48. }
  49. tr[rt].siz++;
  50. if(v<=tr[rt].v)
  51. {
  52. insert(tr[rt].l,v,no);
  53. if(tr[tr[rt].l].rnd<tr[rt].rnd)rturn(rt);
  54. }else
  55. {
  56. insert(tr[rt].r,v,no);
  57. if(tr[tr[rt].r].rnd<tr[rt].rnd)lturn(rt);
  58. }
  59. }
  60. void del(int &rt,int v,int no)
  61. {
  62. if(!rt)return;
  63. tr[rt].siz--;
  64. if(tr[rt].v==v&&tr[rt].no==no)
  65. {
  66. if(tr[rt].l*tr[rt].r==0){rt=tr[rt].l+tr[rt].r;return;}
  67. else
  68. {
  69. if(tr[tr[rt].l].rnd<tr[tr[rt].r].rnd)
  70. {
  71. rturn(rt);
  72. del(rt,v,no);
  73. }else
  74. {
  75. lturn(rt);
  76. del(rt,v,no);
  77. }
  78. }
  79. }else if(v<tr[rt].v)
  80. {
  81. del(tr[rt].l,v,no);
  82. }else del(tr[rt].r,v,no);
  83. }
  84. int ans;
  85. void q_pre(int rt,int v)
  86. {
  87. if(!rt)return;
  88. if(v>=tr[rt].v)
  89. {
  90. ans=rt;
  91. q_pre(tr[rt].r,v);
  92. }else q_pre(tr[rt].l,v);
  93. }
  94. void q_sub(int rt,int v)
  95. {
  96. if(!rt)return;
  97. if(v<tr[rt].v)
  98. {
  99. ans=rt;
  100. q_sub(tr[rt].l,v);
  101. }else q_sub(tr[rt].r,v);
  102. }
  103. struct point
  104. {
  105. int x,y;
  106. }pt[N];
  107. int n,c;
  108. int find(int x)
  109. {
  110. if(x!=fa[x])return fa[x]=find(fa[x]);
  111. return x;
  112. }
  113. int cmp(point a,point b)
  114. {
  115. if(a.x==b.x)return a.y<b.y;
  116. return a.x<b.x;
  117. }
  118. int main()
  119. {
  120. scanf("%d%d",&n,&c);
  121. for(int i=1;i<=n;i++)
  122. {
  123. int x,y;
  124. scanf("%d%d",&x,&y);
  125. pt[i].x=x+y,pt[i].y=x-y;
  126. fa[i]=i;
  127. }
  128. sort(pt+1,pt+n+1,cmp);
  129. int head=1,tail=0;
  130. for(int i=1;i<=n;i++)
  131. {
  132. while(head<=tail&&pt[i].x-pt[q[head]].x>c)
  133. {
  134. del(root,pt[q[head]].y,q[head]);
  135. head++;
  136. }
  137. ans=0;
  138. q_pre(root,pt[i].y);
  139. int tmp=ans;
  140. if(tmp!=0)
  141. {
  142. if(pt[i].y-tr[tmp].v<=c)
  143. {
  144. if(find(i)!=find(tr[tmp].no))
  145. {
  146. fa[find(i)]=find(tr[tmp].no);
  147. }
  148. }
  149. }
  150. ans=0;
  151. q_sub(root,pt[i].y);
  152. tmp=ans;
  153. if(tmp!=0)
  154. {
  155. if(tr[tmp].v-pt[i].y<=c)
  156. {
  157. if(find(i)!=find(tr[tmp].no))
  158. {
  159. fa[find(i)]=find(tr[tmp].no);
  160. }
  161. }
  162. }
  163. insert(root,pt[i].y,i);
  164. q[++tail]=i;
  165. }
  166. int ma=0,print=0;
  167. for(int i=1;i<=n;i++)
  168. {
  169. int fx=find(i);
  170. if(!cnt[fx])
  171. {
  172. print++;
  173. }
  174. cnt[fx]++;
  175. if(cnt[fx]>ma)ma=cnt[fx];
  176. }
  177. printf("%d %d\n",print,ma);
  178. }

BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap的更多相关文章

  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 奶牛的邻居——排序+贪心+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. 【BZOJ1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap+并查集

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

  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. POJ-1456 Supermarket 贪心问题 有时间限制的最小化惩罚问题

    题目链接:https://cn.vjudge.net/problem/POJ-1456 此题与HDU-1789完全是一道题 题意 有N件商品,分别给出商品的价值和销售的最后期限,只要在最后日期之前销售 ...

  2. 常用模块(hashlib、suprocess、configparser)

    hashlib模块 hash是一种接受不了内容的算法,(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算 ...

  3. js中数组增删查改unshift、push、pop、shift、slice、indexOf、concat、join

    js中数组增删查改unshift.push.pop.shift.slice.indexOf.concat.join

  4. 二、 HBase核心功能模块。

      Hadoop 框架包含两个核心组件: HDFS 和 MapReduce 其中     HDFS                是文件存储系统,负责数据存储:     MapReduce     是 ...

  5. C语言函数--E

    函数名: ecvt 功 能: 把一个浮点数转换为字符串 用 法: char ecvt(double value, int ndigit, int *decpt, int *sign); 程序例: #i ...

  6. 2016届 阿里巴巴校招研发project师C/C++笔试题--2015.08.23

    选择题牛客网地址题目1:http://www.nowcoder.com/test/255234/summary. 题目2:http://www.nowcoder.com/test/262758/sum ...

  7. 【SICP练习】152 练习4.8

    练习4-8 原文 Exercise 4.8. "Named let" is a variant of let that has the form (let <var> ...

  8. p2p項目夭折,有種蛋蛋的憂傷。。

      在高考完的暑假就在跟杰哥讨论怎样实现的校内p2p文件共享,就在今天.我们无奈的宣布差点儿夭折. 上图是測试图. 那时候的思路已经完好.就是:"学生上传共享文件到咱们工作室的server. ...

  9. rgba

    正反两面展示效果 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head& ...

  10. PasswordHelper 对user对象的password进行加密重设

    public class PasswordHelper { private RandomNumberGenerator randomNumberGenerator = new SecureRandom ...