[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 ...
随机推荐
- C语言课程设计(成绩管理系统)
C语言课程设计(成绩管理系统) 翻到了大学写的C语言课程设计,缅怀一下 内容: 增加学生成绩 查询学生成绩 删除 按照学生成绩进行排序 等 #include <stdio.h> #incl ...
- SSH框架完全整合
大三学期渐末,事情也挺多的,上周就开始着手整合SSH框架,到现在才真正的完成,过程中碰到了许多小问题(小问题大折腾,哭脸.jpg).本着善始善终的原则,最终把它给完成了. 本篇文章就在: win7 6 ...
- 解决author波浪线Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click
自从把默认的头注释的author改成自己的名字以后越看越顺眼,但是发现名字下面一直有个波浪线,强迫症简直不能忍. 然后当你把鼠标放上去,再点击提示上的"more",会看到下面的提示 ...
- MySQL 如何存储长度较大的varchar与blob
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/96 最近,在工作中遇到了MySQL中如何存储长度较长的字段类型问 ...
- 转战Hexo
从之前的转战farbox,到现在又转战Hexo,真是不折腾不成魔.要说farbox有什么不好,可能唯一的不好就是它要求与Dropbox关联吧,这对于大部分国内用户来说是无法接受的,写文章之前一想到还要 ...
- ubuntu16.04 查询ip,网关,dns信息
用ifconfig命令只能查询ip,子网掩码信息,不能获取dns和网关信息 用下面命令即可查询 nmcli dev show
- ES6 二进制数组
二进制数组(ArrayBuffer对象.TypedArray视图和DataView视图)是JavaScript操作二进制数据的一个接口.这些对象早就存在,属于独立的规格(2011年2月发布),ES6将 ...
- 解决mysql漏洞 Oracle MySQL Server远程安全漏洞(CVE-2015-0411)
有时候会检测到服务器有很多漏洞,而大部分漏洞都是由于服务的版本过低的原因,因为官网出现漏洞就会发布新版本来修复这个漏洞,所以一般情况下,我们只需要对相应的软件包进行升级到安全版本即可. 通过查阅官网信 ...
- flex基础示例
flex的一些基础用法: <!-- Flex布局已经得到了所有浏览器的支持:chrome21+.Opera12.1+.Firefox22+.safari6.1+.IE10+ Webkit内核浏览 ...
- Vue 爬坑之路(七)—— 监听滚动事件 实现动态锚点
前几天做项目的时候,需要实现一个动态锚点的效果 如果是传统项目,这个效果就非常简单.但是放到 Vue 中,就有两大难题: 1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑 ...