就是莫队的模板题

  1. /*
  2. Memory: 0 KB Time: 1663 MS
  3. Language: C++11 4.8.2 Result: Accepted
  4. */
  5.  
  6. #include<cstdio>
  7. #include<cstring>
  8. #include<algorithm>
  9. #include<iostream>
  10. #include<cstdlib>
  11. #include<cmath>
  12. using namespace std;
  13. typedef long long LL;
  14. const int INF=0x3f3f3f3f;
  15. const int maxn=;
  16. struct Point
  17. {
  18. int x,y,id;
  19. bool operator<(const Point &e)const
  20. {
  21. if(x==e.x)return y<e.y;
  22. return x<e.x;
  23. }
  24. } point[maxn];
  25. struct Edge
  26. {
  27. int u,v,w;
  28. bool operator<(const Edge &e)const
  29. {
  30. return w<e.w;
  31. }
  32. } edge[maxn*];
  33. int tot;
  34. void addedge(int u,int v,int w)
  35. {
  36. ++tot;
  37. edge[tot].u=u;
  38. edge[tot].v=v;
  39. edge[tot].w=w;
  40. }
  41. struct Node
  42. {
  43. int minval,pos;
  44. void init()
  45. {
  46. minval=INF;
  47. pos=-;
  48. }
  49. } node[maxn];
  50. int lowbit(int x)
  51. {
  52. return x&(-x);
  53. }
  54. void update(int i,int val,int pos)
  55. {
  56. while(i>)
  57. {
  58. if(val<node[i].minval)
  59. {
  60. node[i].minval=val;
  61. node[i].pos=pos;
  62. }
  63. i-=lowbit(i);
  64. }
  65. }
  66. int query(int i,int m)
  67. {
  68. int minval=INF,pos=-;
  69. while(i<=m)
  70. {
  71. if(node[i].minval<minval)
  72. {
  73. minval=node[i].minval;
  74. pos=node[i].pos;
  75. }
  76. i+=lowbit(i);
  77. }
  78. return pos;
  79. }
  80. int dis(Point a,Point b)
  81. {
  82. return abs(a.x-b.x)+abs(a.y-b.y);
  83. }
  84. int c[maxn],b[maxn],n;
  85. void build()
  86. {
  87. sort(point+,point+n+);
  88. for(int i=; i<=n; ++i)
  89. b[i]=c[i]=point[i].y-point[i].x;
  90. sort(c+,c++n);
  91. int m=unique(c+,c++n)-(c+);
  92. for(int i=; i<=m; ++i)
  93. node[i].init();
  94. for(int i=n; i>; --i)
  95. {
  96. int pos=lower_bound(c+,c++m,b[i])-c;
  97. int tt=query(pos,m);
  98. if(tt!=-)addedge(point[i].id,point[tt].id,dis(point[i],point[tt]));
  99. update(pos,point[i].x+point[i].y,i);
  100. }
  101. }
  102. int fa[maxn];
  103. int find(int x)
  104. {
  105. if(x==fa[x])return x;
  106. return fa[x]=find(fa[x]);
  107. }
  108. LL solve()
  109. {
  110. sort(edge+,edge++tot);
  111. for(int i=; i<=n; ++i)
  112. fa[i]=i;
  113. int cnt=;
  114. LL mst=;
  115. for(int i=; i<=tot; ++i)
  116. {
  117. int fx=find(edge[i].u);
  118. int fy=find(edge[i].v);
  119. if(fx==fy)continue;
  120. fa[fy]=fx;
  121. mst+=edge[i].w;
  122. cnt++;
  123. if(cnt>=n)break;
  124. }
  125. return mst;
  126. }
  127. int main()
  128. {
  129.  
  130. int cas=;
  131. while(~scanf("%d",&n),n)
  132. {
  133. tot=;
  134. for(int i=; i<=n; ++i)
  135. scanf("%d%d",&point[i].x,&point[i].y),point[i].id=i;
  136. build();
  137. for(int i=; i<=n; ++i)
  138. point[i].y=-point[i].y;
  139. build();
  140. for(int i=; i<=n; ++i)
  141. point[i].y=-point[i].y,swap(point[i].x,point[i].y);
  142. build();
  143. for(int i=; i<=n; ++i)
  144. point[i].y=-point[i].y;
  145. build();
  146. printf("Case %d: Total Weight = %lld\n",++cas,solve());
  147. }
  148. return ;
  149. }

UVAlive3662 Another Minimum Spanning Tree 莫队算法的更多相关文章

  1. HDU 3333 Turing Tree 莫队算法

    题意: 给出一个序列和若干次询问,每次询问一个子序列去重后的所有元素之和. 分析: 先将序列离散化,然后离线处理所有询问. 用莫队算法维护每个数出现的次数,就可以一边移动区间一边维护不同元素之和. # ...

  2. 最小生成树 (Minimum Spanning Tree,MST) --- Prim算法

    本文链接:http://www.cnblogs.com/Ash-ly/p/5409904.html 普瑞姆(Prim)算法: 假设N = (V, {E})是连通网,TE是N上最小生成树边的集合,U是是 ...

  3. 最小生成树 (Minimum Spanning Tree,MST) --- Kruskal算法

    本文链接:http://www.cnblogs.com/Ash-ly/p/5409265.html 引导问题: 假设要在N个城市之间建立通信联络网,则连通N个城市只需要N - 1条线路.这时,自然会考 ...

  4. 【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解

    本节纲要 什么是图(network) 什么是最小生成树 (minimum spanning tree) 最小生成树的算法 什么是图(network)? 这里的图当然不是我们日常说的图片或者地图.通常情 ...

  5. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  6. 「日常训练&知识学习」莫队算法(二):树上莫队(Count on a tree II,SPOJ COT2)

    题意与分析 题意是这样的,给定一颗节点有权值的树,然后给若干个询问,每次询问让你找出一条链上有多少个不同权值. 写这题之前要参看我的三个blog:Codeforces Round #326 Div. ...

  7. [Codeforces375D]Tree and Queries(莫队算法)

    题意:给定一棵树,每个节点有颜色,对于每个询问(u,k)询问以u为根节点的子树下有多少种颜色出现次数>=k 因为是子树,跟dfs序有关,转化为一段区间,可以用莫队算法求解 直接用一个数组统计出现 ...

  8. SPOJ COT2 Count on a tree II 树上莫队算法

    题意: 给出一棵\(n(n \leq 4 \times 10^4)\)个节点的树,每个节点上有个权值,和\(m(m \leq 10^5)\)个询问. 每次询问路径\(u \to v\)上有多少个权值不 ...

  9. 说说最小生成树(Minimum Spanning Tree)

    minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...

随机推荐

  1. C#结合js 上传文件和删除文件(技术点有:asp.net mvc ,nhibernate,ajax等)

    之前做项目的时候要用到上传文件的功能,现在我总结一下,上传文件和删除文件的代码,在以后的使用的过程中也更方便查找. [HttpPost] public ActionResult EditUser() ...

  2. CSS两列及三列自适应布局方法整理

    布局 自适应 两列 三列 在传统方法的基础上加入了Flex布局并阐述各方法的优缺点,希望对大家有所帮助.先上目录: 两列布局:左侧定宽,右侧自适应 方法一:利用float和负外边距 方法二:利用外边距 ...

  3. 2038: [2009国家集训队]小Z的袜子(hose) - BZOJ

    Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只 ...

  4. CSS+DIV:父DIV相对定位+子DIV绝对定位

    如何在一个div内将一个div进行绝对定位呢?很简单,把父div的position属性设为relative,子div的position属性设为absolute就可以了... 示例: <html& ...

  5. PAT-乙级-1025. 反转链表 (25)

    1025. 反转链表 (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一个常数K以及一个单链表L,请 ...

  6. The 7th Zhejiang Provincial Collegiate Programming Contest->Problem G:G - Wu Xing

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3328 至今未看懂题意,未编译直接提交,然后 A了.莫名AC总感觉怪怪的. ...

  7. uva 1421

    稍微有点新意的二分 #include<cstdio> #include<cstring> #include<algorithm> #include<cmath ...

  8. C++函数中那些不可以被声明为虚函数的函数

    转自C++函数中那些不可以被声明为虚函数的函数 常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函 ...

  9. hibernate annotation注解 主键ID自增长

    @Id @SequenceGenerator(name="increment") @GeneratedValue(strategy=GenerationType.AUTO, gen ...

  10. MVC 导出PDF

    http://www.simple-talk.com/dotnet/asp.net/asp.net-mvc-action-results-and-pdf-content/ http://www.sub ...