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# json to dynamic object
dynamic obj = Newtonsoft.Json.JsonConvert.DeserializeObject(json); string greeting = obj.greeting; R ...
- storm sum aggregate 原语 聚合 本地测试
编写storm程序,对数据进行聚合并且写入到mysql, 本文 主要说明数据中有多个字段需要进行sum或其他操作时的程序写法 1.主程序main方法,storm 拓扑运行入口 public clas ...
- Linux的安装 CentOS-7.1
说明: 首先,版本:7.1版:CentOS-7-x86_64-Everything-1503-01.iso 下载自:http://mirrors.163.com/centos/7/isos/x86_6 ...
- zoj 3620 Escape Time II dfs
题目链接: 题目 Escape Time II Time Limit: 20 Sec Memory Limit: 256 MB 问题描述 There is a fire in LTR ' s home ...
- 原生js获取window高和宽
视口的宽和高 var pw = window.innerWidth, ph = window.innerHeight; if(typeof pw != "number"){ pw ...
- JAVA CAS单点登录(SSO) 教程
一.教程前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登录(SSO):请看百科解释猛击这里打开 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Auth ...
- uva 11143
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 5100 #include& ...
- jsp关于include html、jsp等文件出现乱码问题的解决方案
一般来说使用jsp标签<jsp:include>引入一个jsp文件: ①可以在被引入的jsp中加入:<%@ page contentType="text/html;char ...
- 李洪强漫谈iOS开发[C语言-013]-常量
// // main.m // 09 - 常量 // // Created by 李洪强 on 16/7/17. // Copyright © 2016年 李洪强. All rights re ...
- Git教程之使用GitHub
我们一直用GitHub作为免费的远程仓库,如果是个人的开源项目,放到GitHub上是完全没有问题的.其实GitHub还是一个开源协作社区,通过GitHub,既可以让别人参与你的开源项目,也可以参与别人 ...