[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 ...
随机推荐
- [array] leetcode - 54. Spiral Matrix - Medium
leetcode-54. Spiral Matrix - Medium descrition GGiven a matrix of m x n elements (m rows, n columns) ...
- Ubuntu字符界面输入密码始终提示错误 login incorrect 解决办法
方法1. 先输入用户名按enter,然后ctrl+alt+f7 切换回图形界面,然后再切换到字符界面输密码 方法2.先输入用户名按enter,然后关闭小键盘上的numlock按键再打开,再输入密码 f ...
- windows 下共享内存使用方法示例
windows下共享内存使用方法较 linux 而言微微复杂 示例实现的功能 有一个视频文件,一块内存区域 : 程序 A,将该视频写入该内存区域 : 程序 B,从该内存区域读取该视频 : 代码模块实现 ...
- kendo ui grid选中行事件,获取combobox选择的值
背景: 以前用 telerik ui做的grid现在又要换成kendo ui,不过说句实话kendo ui真的比telerik好多,可以说超级升级改头换面.当然用的mvc的辅助方法,以前的teleri ...
- bzoj 4444: [Scoi2015]国旗计划
Description A国正在开展一项伟大的计划--国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的 ...
- SpringJDBC的JdbcTemplate在MySQL5.7下不支持子查询的问题
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [ SELECT ...
- npm lodash
在数据操作时,Lodash 就是我的弹药库,不管遇到多复杂的数据结构都能用一些函数轻松拆解. ES6 中也新增了诸多新的对象函数,一些简单的项目中 ES6 就足够使用了,但还是会有例外的情况引用了少数 ...
- 冲顶大会APP技术选型及架构设计
我在1月4日看到虎嗅推送"王思聪撒币"的消息,然后开始推敲背后技术.其中涉及直播流.实时弹幕.OAuth2.0开放授权.SMS api.Push网关.支付接口等业务,其技术实现并不 ...
- Java 反编译工具下载
反编译,通俗来讲,就是将.java 文件经过编译生成的 .class 文件还原.注意这里的还原不等于 .java 文件.因为Java编译器在编译.java 文件的时候,会对代码进行一些处理. 那么接下 ...
- Python第二十一天 fileinput模块
Python第二十一天 fileinput模块 fileinput模块 fileinput.input([files[, inplace[, backup[, bufsize[, mode[, ...