UVAlive3662 Another Minimum Spanning Tree 莫队算法
就是莫队的模板题
- /*
- Memory: 0 KB Time: 1663 MS
- Language: C++11 4.8.2 Result: Accepted
- */
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- #include<cstdlib>
- #include<cmath>
- using namespace std;
- typedef long long LL;
- const int INF=0x3f3f3f3f;
- const int maxn=;
- struct Point
- {
- int x,y,id;
- bool operator<(const Point &e)const
- {
- if(x==e.x)return y<e.y;
- return x<e.x;
- }
- } point[maxn];
- struct Edge
- {
- int u,v,w;
- bool operator<(const Edge &e)const
- {
- return w<e.w;
- }
- } edge[maxn*];
- int tot;
- void addedge(int u,int v,int w)
- {
- ++tot;
- edge[tot].u=u;
- edge[tot].v=v;
- edge[tot].w=w;
- }
- struct Node
- {
- int minval,pos;
- void init()
- {
- minval=INF;
- pos=-;
- }
- } node[maxn];
- int lowbit(int x)
- {
- return x&(-x);
- }
- void update(int i,int val,int pos)
- {
- while(i>)
- {
- if(val<node[i].minval)
- {
- node[i].minval=val;
- node[i].pos=pos;
- }
- i-=lowbit(i);
- }
- }
- int query(int i,int m)
- {
- int minval=INF,pos=-;
- while(i<=m)
- {
- if(node[i].minval<minval)
- {
- minval=node[i].minval;
- pos=node[i].pos;
- }
- i+=lowbit(i);
- }
- return pos;
- }
- int dis(Point a,Point b)
- {
- return abs(a.x-b.x)+abs(a.y-b.y);
- }
- int c[maxn],b[maxn],n;
- void build()
- {
- sort(point+,point+n+);
- for(int i=; i<=n; ++i)
- b[i]=c[i]=point[i].y-point[i].x;
- sort(c+,c++n);
- int m=unique(c+,c++n)-(c+);
- for(int i=; i<=m; ++i)
- node[i].init();
- for(int i=n; i>; --i)
- {
- int pos=lower_bound(c+,c++m,b[i])-c;
- int tt=query(pos,m);
- if(tt!=-)addedge(point[i].id,point[tt].id,dis(point[i],point[tt]));
- update(pos,point[i].x+point[i].y,i);
- }
- }
- int fa[maxn];
- int find(int x)
- {
- if(x==fa[x])return x;
- return fa[x]=find(fa[x]);
- }
- LL solve()
- {
- sort(edge+,edge++tot);
- for(int i=; i<=n; ++i)
- fa[i]=i;
- int cnt=;
- LL mst=;
- for(int i=; i<=tot; ++i)
- {
- int fx=find(edge[i].u);
- int fy=find(edge[i].v);
- if(fx==fy)continue;
- fa[fy]=fx;
- mst+=edge[i].w;
- cnt++;
- if(cnt>=n)break;
- }
- return mst;
- }
- int main()
- {
- int cas=;
- while(~scanf("%d",&n),n)
- {
- tot=;
- for(int i=; i<=n; ++i)
- scanf("%d%d",&point[i].x,&point[i].y),point[i].id=i;
- build();
- for(int i=; i<=n; ++i)
- point[i].y=-point[i].y;
- build();
- for(int i=; i<=n; ++i)
- point[i].y=-point[i].y,swap(point[i].x,point[i].y);
- build();
- for(int i=; i<=n; ++i)
- point[i].y=-point[i].y;
- build();
- printf("Case %d: Total Weight = %lld\n",++cas,solve());
- }
- return ;
- }
UVAlive3662 Another Minimum Spanning Tree 莫队算法的更多相关文章
- HDU 3333 Turing Tree 莫队算法
题意: 给出一个序列和若干次询问,每次询问一个子序列去重后的所有元素之和. 分析: 先将序列离散化,然后离线处理所有询问. 用莫队算法维护每个数出现的次数,就可以一边移动区间一边维护不同元素之和. # ...
- 最小生成树 (Minimum Spanning Tree,MST) --- Prim算法
本文链接:http://www.cnblogs.com/Ash-ly/p/5409904.html 普瑞姆(Prim)算法: 假设N = (V, {E})是连通网,TE是N上最小生成树边的集合,U是是 ...
- 最小生成树 (Minimum Spanning Tree,MST) --- Kruskal算法
本文链接:http://www.cnblogs.com/Ash-ly/p/5409265.html 引导问题: 假设要在N个城市之间建立通信联络网,则连通N个城市只需要N - 1条线路.这时,自然会考 ...
- 【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解
本节纲要 什么是图(network) 什么是最小生成树 (minimum spanning tree) 最小生成树的算法 什么是图(network)? 这里的图当然不是我们日常说的图片或者地图.通常情 ...
- 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集
最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...
- 「日常训练&知识学习」莫队算法(二):树上莫队(Count on a tree II,SPOJ COT2)
题意与分析 题意是这样的,给定一颗节点有权值的树,然后给若干个询问,每次询问让你找出一条链上有多少个不同权值. 写这题之前要参看我的三个blog:Codeforces Round #326 Div. ...
- [Codeforces375D]Tree and Queries(莫队算法)
题意:给定一棵树,每个节点有颜色,对于每个询问(u,k)询问以u为根节点的子树下有多少种颜色出现次数>=k 因为是子树,跟dfs序有关,转化为一段区间,可以用莫队算法求解 直接用一个数组统计出现 ...
- SPOJ COT2 Count on a tree II 树上莫队算法
题意: 给出一棵\(n(n \leq 4 \times 10^4)\)个节点的树,每个节点上有个权值,和\(m(m \leq 10^5)\)个询问. 每次询问路径\(u \to v\)上有多少个权值不 ...
- 说说最小生成树(Minimum Spanning Tree)
minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...
随机推荐
- C#结合js 上传文件和删除文件(技术点有:asp.net mvc ,nhibernate,ajax等)
之前做项目的时候要用到上传文件的功能,现在我总结一下,上传文件和删除文件的代码,在以后的使用的过程中也更方便查找. [HttpPost] public ActionResult EditUser() ...
- CSS两列及三列自适应布局方法整理
布局 自适应 两列 三列 在传统方法的基础上加入了Flex布局并阐述各方法的优缺点,希望对大家有所帮助.先上目录: 两列布局:左侧定宽,右侧自适应 方法一:利用float和负外边距 方法二:利用外边距 ...
- 2038: [2009国家集训队]小Z的袜子(hose) - BZOJ
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只 ...
- CSS+DIV:父DIV相对定位+子DIV绝对定位
如何在一个div内将一个div进行绝对定位呢?很简单,把父div的position属性设为relative,子div的position属性设为absolute就可以了... 示例: <html& ...
- PAT-乙级-1025. 反转链表 (25)
1025. 反转链表 (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一个常数K以及一个单链表L,请 ...
- The 7th Zhejiang Provincial Collegiate Programming Contest->Problem G:G - Wu Xing
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3328 至今未看懂题意,未编译直接提交,然后 A了.莫名AC总感觉怪怪的. ...
- uva 1421
稍微有点新意的二分 #include<cstdio> #include<cstring> #include<algorithm> #include<cmath ...
- C++函数中那些不可以被声明为虚函数的函数
转自C++函数中那些不可以被声明为虚函数的函数 常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函 ...
- hibernate annotation注解 主键ID自增长
@Id @SequenceGenerator(name="increment") @GeneratedValue(strategy=GenerationType.AUTO, gen ...
- MVC 导出PDF
http://www.simple-talk.com/dotnet/asp.net/asp.net-mvc-action-results-and-pdf-content/ http://www.sub ...