[51nod1213]二维曼哈顿距离最小生成树
二维平面上有N个坐标为整数的点,点x1 y1同点x2 y2之间的距离为:横纵坐标的差的绝对值之和,即:Abs(x1 - x2) + Abs(y1 - y2)(也称曼哈顿距离)。求这N个点所组成的完全图的最小生成树的边权之和。
Input
第1行:1个数N,表示点的数量。(2 <= N <= 50000)
第2 - N + 1行:每行2个数,表示点的坐标(0 <= x, y <= 1000000)
Output
输出N个点所组成的完全图的最小生成树的边权之和。
就当是攒新板子了。。
题解:http://blog.csdn.net/acm_cxlove/article/details/8890003
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#define ll long long
#define ull unsigned long long
#define ui unsigned int
//#define d double
#define ld long double
const int maxn=,inf=;
struct zs{int x,y,v,id;}a[maxn],aa[maxn],e[maxn<<];int ne;
struct zs1{int v,id;}t[maxn],b[maxn];
int fa[maxn];
int i,j,k,n,m;
ll ans; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while(rx<''&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>='')ra=ra*+rx-,rx=getchar();return ra*fh;
} inline int abs(int x){return x<?-x:x;}
inline int getdis(int a,int b){
return abs(aa[a].x-aa[b].x)+abs(aa[a].y-aa[b].y);
}
inline void insert(int a,int b){
/*e[++tot].too=b,e[tot].pre=last[a],last[a]=tot,
e[++tot].too=a,e[tot].pre=last[b],last[b]=tot,
e[tot-1].dis=e[tot].dis=getdis(a,b);*/
e[++ne]=(zs){a,b,getdis(a,b)};
} bool operator <(zs a,zs b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
bool operator <(zs1 a,zs1 b){return a.v<b.v;}
bool cmpe(zs a,zs b){return a.v<b.v;} inline void mins(zs1 &a,zs1 b){if(b.v<a.v)a=b;}
inline void add(int x,zs1 mn){while(x<=n)mins(t[x],mn),x+=x&-x;}
inline int query(int x){zs1 mn=(zs1){inf,-};while(x)mins(mn,t[x]),x-=x&-x;return mn.id;}
inline void run(){
int i,cnt=;
for(i=;i<=n;i++)t[i]=(zs1){inf,-};
for(i=;i<=n;i++)b[i]=(zs1){a[i].y-a[i].x,i};
std::sort(b+,b++n);
for(i=;i<=n;a[b[i].id].v=n-cnt+,i++)cnt+=b[i].v!=b[i-].v||i==;
std::sort(a+,a++n);
for(i=n;i;i--){
int id=query(a[i].v);
if(id>)insert(a[i].id,id);
add(a[i].v,(zs1){a[i].x+a[i].y,a[i].id});
}
} inline int getfa(int x){return fa[x]!=x?fa[x]=getfa(fa[x]):x;}
int main(){
n=read();
for(i=;i<=n;i++)aa[i].x=read(),aa[i].y=read(); for(i=;i<=n;i++)a[i].x=aa[i].x,a[i].y=aa[i].y,a[i].id=i;
run(); for(i=;i<=n;i++)a[i].x=aa[i].x,a[i].y=-aa[i].y,a[i].id=i;
run(); for(i=;i<=n;i++)a[i].x=aa[i].y,a[i].y=aa[i].x,a[i].id=i;
run(); for(i=;i<=n;i++)a[i].x=-aa[i].y,a[i].y=aa[i].x,a[i].id=i;
run(); std::sort(e+,e++ne,cmpe);
for(i=;i<=n;i++)fa[i]=i;
for(i=;i<=ne;i++)if(getfa(e[i].x)!=getfa(e[i].y))
fa[fa[e[i].x]]=fa[e[i].y],ans+=e[i].v;
printf("%lld\n",ans);
}
[51nod1213]二维曼哈顿距离最小生成树的更多相关文章
- 51nod 1213 二维曼哈顿距离最小生成树
1213 二维曼哈顿距离最小生成树 基准时间限制:4 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 二维平面上有N个坐标为整数的点,点x1 y1同点x2 y2之间 ...
- 【POJ 3241】Object Clustering 曼哈顿距离最小生成树
http://poj.org/problem?id=3241 曼哈顿距离最小生成树模板题. 核心思想是把坐标系转3次,以及以横坐标为第一关键字,纵坐标为第二关键字排序后,从后往前扫.扫完一个点就把它插 ...
- 曼哈顿距离最小生成树 codechef Dragonstone
曼哈顿距离最小生成树 codechef Dragonstone 首先,对于每一个点来说有用的边只有它向它通过 x=0,y=0,y=x,y=-x 切出来的八个平面的最近点. 证明 我不会 反正当结论记住 ...
- LA 3662 Another Minimum Spanning Tree (曼哈顿距离最小生成树 模板)
题目大意: 曼哈顿最小距离生成树 算法讨论: 同上. 这回的模板真的准了. #include <iostream> #include <cstring> #include &l ...
- hdu6435 Problem J. CSGO标程讲解以及改正标程的一个错误(本来第一个样例过不了2333) 以及 poj2926 五维曼哈顿距离模板
比赛的时候抄poj2926的模板,但改不来啊orz #include <iostream> #include <cstdio> #include <cstring> ...
- POJ 3241 曼哈顿距离最小生成树 Object Clustering
先上几个资料: 百度文库有详细的分析和证明 cxlove的博客 TopCoder Algorithm Tutorials #include <cstdio> #include <cs ...
- POJ 3241Object Clustering曼哈顿距离最小生成树
Object Clustering Description We have N (N ≤ 10000) objects, and wish to classify them into several ...
- BZOJ 2735: 世博会 主席树+切比雪夫距离转曼哈顿距离
2735: 世博会 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 124 Solved: 51[Submit][Status][Discuss] D ...
- Unity插件系列之二维码
1.二维码常见的生成与识别途径 1.草料二维码 https://cli.im/text 2.在软件中实现生成和扫描二维码 使用zxing实现 zxing是一个用java写的开源项目,zxing.net ...
随机推荐
- springboot 结合mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- Hibernate学习---Configuration,Session,SessionFactory
上一节我们讲到了Hibernate的测试,并且给出了测试代码,刚开始看见这个测试代码的同学估计是一头雾水把,所以这一节我们来讲一下测试代码. 本节主要内容: Configuration Session ...
- UITextFiled的输入框改成一条下划线
在一些程序的界面中,它们的编辑框是一条线,而UITextFiled本身并没有这种style,所有需要我们自己设置.方法还是挺多的 第一种 , (1).我们可以声明一个类继承与UITextFiled ( ...
- SecureCRT连接本地的Vmware虚拟机(CentOS)时提示连接超时“Connection timed out”
测试了一下,直接在Vmware的VM里面可以ping通宿主机. 但是宿主机无法ping通VM. 后面发现是本地的网络设置里面的vmware的NAT的网卡设置了手工填写地址和DNS. 修改为自动获取.问 ...
- JavaScript获取数组最小值和最大值的方法
本文实例讲述了JavaScript获取数组最小值和最大值的方法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 var arr = new Array(); arr[0] = 100; ...
- jsonp及cors
一. jsonp实现原理是利用script标签可以获取不同源资源的特点,来达到跨域访问某个资源的目的.具体行为如下: 创建一个script标签,将请求地址写入它的src属性,将这个script外链插入 ...
- chrome调试工具高级不完整使用指南(基础篇)
一.前言 本文记录的是作者在工作上面对chrome的一些使用和情况的分析分享,内容仅代表个人的观点.转发请注明出处(http://www.cnblogs.com/st-leslie/),谢谢合作 二. ...
- Micropython教程之TPYBoardv102 DIY蓝牙智能小车实例
1.实验目的 1.学习在PC机系统中扩展简单I/O接口的方法. 2.进一步学习编制数据输出程序的设计方法. 3.学习蓝牙模块的接线方法及其工作原理. 4.学习L298N电机驱动板模块的接线方法. 5. ...
- Sql Server Configuration Manager 网络配置为空,没有实例
新用户一天内不准提问...Sql Server Configuration Manager 网络配置为空,没有实例无法设置ip和端口进行连接..
- apidoc快速生成在线文档,apidoc生成静态文件的生成规则以及原理分析
在老大的指引下,需要将系统的json文件格式转换成apidoc的json格式,也就是json格式的重组,但是这个apidoc的生成格式是不固定的,因为apidoc有自己一套的生成规则,我需要研究一下是 ...