关于曼哈顿距离下的最小生成树

曼哈顿距离最小生成树与莫队算法 一、曼哈顿距离最小生成树 曼哈顿距离最小生成树问题可以简述如下: 给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价。 朴素的算法可以用O(N2)的Prim,或者处理出所有边做Kruskal,但在这里总边数有O(N2)条,所以Kruskal的复杂度变成了O(N2logN)。 但是事实上,真正有用的边远没有O(N2)条。我们考虑每个点会和其他一些什么样的点连 阅读详情

这些天一直在集训,考了十几次……

zzy出了一道曼哈顿距离下的最小生成树,考场上我没做出来……

嗯……这种题目的问题在于,你没办法把每两个点都建一条边……

但是因为是曼哈顿距离,所以有一些特殊性质

容易证明,将某个点为原点建立笛卡尔坐标系,将坐标系分为每45°角为一块的八个区域

那么这个点向每个区域只会朝其中的某个点连边……

为什么说容易证明,因为我不会证……网上MS有这种证明的说……

贴一下zzy的题解:


所以我们只要求一个点在其45°角的区域内离他最近的点就行了,而这可以用线段树或树状数组解决

我们以y轴正半轴往右偏45°角的区域为例:

点j在点i的这个区域要满足的条件是:

yj-xj>yi-xi

且xj>xi

那么我们将点以x为第一关键字,y为第二关键字,排序后倒序插入线段树

线段树的线段这一维是离散后的y-x,值是y+x

我们要求的是大于yi-xi的最小的y+x,而xj>xi这个条件已经由插入顺序满足了

这样我们成功的解决了这个区域的点

而其他区域的点我们可以通过坐标变换转移到这个区域

由于对称性,我们注意到其实只要求x轴或y轴正半轴所在的四个区域就行了

那么这个问题就这样解决了

不过,我没有找到地方提交这个题目……只是AC了zzy的题


代码在此:题目是求最小生成树上第k大边,使用了树状数组

//Lib
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
//Macro
#define	rep(i,a,b)	for(int i=a,tt=b;i<=tt;++i)
#define	drep(i,a,b)	for(int i=a,tt=b;i>=tt;--i)
#define	erep(i,e,x)	for(int i=x;i;i=e[i].next)
#define	irep(i,x)	for(typeof(x.begin()) i=x.begin();i!=x.end();i++)
#define	read()	(strtol(ipos,&ipos,10))
#define	sqr(x)	((x)*(x))
#define	pb	push_back
#define	PS	system("pause");
typedef	long long	ll;
typedef	pair<int,int>	pii;
const int oo=~0U>>1;
const double inf=1e100;
const double eps=1e-6;
string name="BRS", in=".in", out=".out";
//Var
int n,K,cnt,tot,ans;
int lisan[100008],l[100008];
int limit=1000000008;
struct P
{
	int x,y,idx;	
	bool operator <(const P &o)const{return x<o.x||x==o.x&&y<o.y;}
}d[100008];
struct BIT
{
	static const int limit=100000;
	int s[100008],p[100008];
	void set(){rep(i,1,limit)s[i]=oo;}
	inline int lowbit(int x){return x&-x;}
	void insert(int x,int v,int pos)
	{
		for(int i=x;i>0;i-=lowbit(i))
			if(s[i]>v)s[i]=v,p[i]=pos;
	}
	int query(int x)
	{
		int ret=oo,pos=n+1;
		for(int i=x;i<=n;i+=lowbit(i))
			if(s[i]<ret)ret=s[i],pos=p[i];
		return pos;
	}
}Q;
struct E
{
	int a,b,c;
	bool operator <(const E &o)const{return c<o.c;}
}e[1000000];
struct UNION
{
	int f[100008];
	static const int limit=100000;
	void set(){rep(i,1,n)f[i]=i;}
	int find(int x){return x==f[x]?f[x]:f[x]=find(f[x]);}
	void Union(int x,int y){f[x]=y;}
}U;
void Init()
{
	scanf("%d%d",&n,&K);
	rep(i,1,n)
		scanf("%d%d",&d[i].x,&d[i].y);	
}
void Discrate()
{
	rep(i,1,n)l[i]=d[i].y-d[i].x;
	sort(l+1,l+1+n);
	rep(i,1,n)lisan[i]=lower_bound(l+1,l+1+n,d[i].y-d[i].x)-l;
}
void add(int a,int b,int c){e[++tot].a = a;e[tot].b = b;e[tot].c = c;}
int Dis(int i,int j){return abs(d[i].x - d[j].x) + abs(d[i].y - d[j].y);}
void Solve()
{
	sort(d + 1,d + 1 + n);
	Discrate();Q.set();
	int pos;
	drep(i,n,1)
	{
		pos = Q.query(lisan[i]);
		if(pos != Q.limit + 1)
			add(d[i].idx,d[pos].idx,Dis(i,pos));
		Q.insert(lisan[i],d[i].y + d[i].x,i);
	}
}
void Kruskal()
{
	sort(e+1,e+1+tot);
	int x,y;int cnt=n-K;
	U.set();
	for(int i=1;i<=tot&&cnt;i++)
	{
		x=U.find(e[i].a);y=U.find(e[i].b);
		if(x!=y)
		{
			U.Union(x,y);
			cnt--;ans=e[i].c;
		}
	}
}
void Work()
{
	rep(i,1,n)d[i].idx=i;
	rep(i,1,4)
	{
		if(i == 3)
			rep(j,1,n)d[j].x = limit - d[j].x;
		if(i == 2 || i == 4)
			rep(j,1,n)swap(d[j].x,d[j].y);
		Solve();
	}	
	Kruskal();
	cout<<ans<<endl;
}
int main()
{
	freopen((name+in).c_str(),"r",stdin);
	freopen((name+out).c_str(),"w",stdout);
	Init();
	Work();
//	PS;
	return 0;
}
不知道是因为STL还是把数据结构封装在结构体里面的原因

这个程序效率巨低,开O2和不开O2差距达到1倍以上……虽然我觉得这种写法很优美就是了……

codeforces 100959B Airports 曼哈顿距离最大生成树 写了两种做法。 1. 对于每个点,向八个象限建最长边,注意最长边没有最短边的对称性,故每个点不能只枚举4个方向,要8个方向都枚举。这个做法速度较快,用的树状数组: #include using namespace std; typedef pair pii; const int maxn=100005; const int inf=2e9+1; int n,pos[maxn],f[maxn] 阅读详情

相关推荐

华为Atlas 300I推理卡驱动安装全攻略:从环境检查到常见问题解决

本文提供了华为Atlas 300I推理卡驱动安装的完整实战指南。从安装前的系统环境检查、内核版本匹配,到详细的二进制.run文件安装步骤、源码编译及高级定制化部署,涵盖了驱动安装的全流程。文章重点解析了安装过程中的关键决策、常见问题排查与解决方案,并针对生产环境的多卡配置、性能调优及安全加固给出了专业建议,旨在帮助用户高效、稳定地完成AI推理加速卡的部署。

swift5iosmith的博客 628

图论 —— 生成树 —— 曼哈顿距离最小生成树

【概述】 当给出一些二维平面的点时,记两点间距离为曼哈顿距离,此时的最小生成树,称为曼哈顿最小距离生成树。 对于 n 个点来说,最朴素的做法是暴力求出所有所有点两两之间的曼哈顿距离,然后再跑最小生成树算法,以得到曼哈顿最小距离生成树,但这样来做,由于总边数有 n^2 条,时间复杂度会达到 O(n^3) 或 O(n^2 logn) 对于 Kruskal 来说,针对这种曼哈顿距离的 MST 问题...

Alex_McAvoy的博客 4208

RK3568(buildroot)利用squashfs+overlay实现嵌入式系统高可靠存储方案

本文详细介绍了在RK3568嵌入式平台上,基于Buildroot系统,利用squashfs只读根文件系统与overlayfs可写层相结合的高可靠存储方案。该方案能有效防止设备意外断电导致的系统文件损坏,通过内核配置、启动脚本编写及镜像制作,实现系统核心的只读保护与用户数据的持久化分离,显著提升嵌入式设备的现场稳定性。

weixin_29189381的博客 547

知识点 - 曼哈顿距离最小生成树

知识点 - 曼哈顿距离最小生成树 解决问题类型: 求解曼哈顿距离上的最小生成树 前置知识 曼哈顿距离:给定二维平面上的N个点,在两点之间连边的代价。(即distance(P1,P2)=∣x1-x2∣+∣y1-y2∣distance(P1,P2) = |x1-x2|+|y1-y2|distance(P1,P2)=∣x1-x2∣+∣y1-y2∣) 曼哈顿距离最小生成树问题求什么?求使所有点连通...

qq_41848675的博客 993

在MDK5.37版本中添加Complier Version 5( 解决Missing Compiler Version 5 )

本文章仅作为个人学习记录,方法也是从其他博主的博客中得到的,链接如下:二、Keil——Missing Compiler Version 5 和 core_cm3.c 问题解决 - YI颗白菜 - 博客园 (cnblogs.com) 问题描述 更新最新的keil版本(MDK5.37)后,在编译以前版本的工程文件时,发现出现了非常多的报错,在网上搜索之后发现原来时编译器版本不匹配的问题,即MDK5.37中使用的是Version 6版本的编译器,而缺少Version 5,对于以前编写的工

leveling99的博客 1万+

AIDD机器学习深度学习药物发现与设计教程总结

AIDD(AI Drug Discovery & Design):是近年来非常火热的技术应用,且已经介入到新药设计到研发的大部分环节当中,为新药发现与开发带来了极大的助力。倾向于机器对数据库信息的自我学习,可以对数据进行提取和学习,一定程度上避免了化合物设计过程中的试错路径,同时还会带来很多全新的结构,为药物发现打破常规的结构壁垒。覆盖了机器学习和深度学习,能与新药研发相结合并实质性的应用到靶点预测、高通量筛选、药物设计、药物的ADMET性质预测等;且算力方面,由早期应用于药物发现领域的决策树、随机

wutianlin0723的博客 6816

曼哈顿距离最小生成树

一、前人种树 博客:曼哈顿距离最小生成树与莫队算法 博客:学习总结:最小曼哈顿距离生成树 二、知识梳理 曼哈顿距离:给定二维平面上的N个点,在两点之间连边的代价。(即distance(P1,P2) = |x1-x2|+|y1-y2|) 曼哈顿距离最小生成树问题求什么?求使所有点连通的最小代价。 最小生成树的“环切”性质:在图G = (V, E)中,如果存在一个环,那么把环上的最大...

weixin_34019144的博客 337

缺陷检测-金属表面缺陷检测

1介绍 缺陷检测是工业视觉技术中最重要的组成部分。业务广泛,场景丰富,技术难点高、工作量大。针对不同的场景,选择不同的相机和

huneng1991的专栏 5250

曼哈顿距离最小生成树&莫队算法

参考资料:https://www.cnblogs.com/CsOH/p/5904430.html                   https://blog.youkuaiyun.com/huzecong/article/details/8576908                   https://www.cnblogs.com/xzxl/p/7237246.html              ...

二喵君的博客 1413

【文献笔记】ICCV 2021 | Point Transformer

作者提到,特别适合点云处理,因为自注意力机制是的核心,本质上就是一个集合算子:它对输入元素具有顺序不变性和数量不变性3D点云是无序的,即使改变点云txt文件中的点顺序也不会有任何影响。自注意力机制天然具有排列不变性,因为它通过对所有"点对"的关系进行建模来处理输入,而不依赖于任何特定的输入顺序点云数据通常覆盖了3D空间中的对象或场景,理解这些数据需要捕捉点与点之间复杂的空间关系。自注意力机制能够有效的捕捉这些关系,因为它为每个"点对"赋予一个。

m0_55908255的博客 965

openbmc 支持mctp over pcie(二)

本文介绍了在OpenBMC系统中实现MCTP over PCIe的社区方案,主要针对AMD CPU和Intel CPU平台。方案基于社区开发的mctpd应用层和内核驱动,通过修改设备树(dts)配置内存区域,并编译Linux内核模块。验证时可通过查看/proc/net/protocols确认MCTP协议支持,使用ip addr命令检查mctppci0网络接口状态。相关代码和文档参考了AspeedTech和CodeConstruct的GitHub仓库。该方案为BMC作为MCTP端点提供了标准化实现方法。

wit_yuan的专栏 377

POJ 3241 Object Clustering 二维平面曼哈顿距离最小生成树

题目链接:点击打开链接 题意: 给定二维平面上的n个点坐标,常数k 下面n行给出坐标 求一个最小生成树,问第k大的边是多少。 任意两个点间建一条边的花费是其曼哈顿距离。 思路:转自:点击打开链接 一、曼哈顿距离最小生成树 曼哈顿距离最小生成树问题可以简述如下: 给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价。 朴素的算法

九野的博客 2937

Google Earth Engine:LandTrendr (Landsat Collection 2)全更新使用(代码调用+UI交互)

本文介绍了使用Landsat Collection 2进行连续变化监测的分析方法,包含代码实现和可视化界面两部分。代码部分通过Google Earth Engine平台运行LandTrendr算法,设置参数包括时间范围、光谱指数、变化检测阈值等,最终生成变化幅度和检测年份的可视化图层,并将结果导出至Google Drive。可视化界面部分展示了基于LandTrendr的土地覆盖变化结果,结合Landsat影像进行分析。整个方法实现了从数据处理到结果展示的完整流程,适用于森林覆盖等环境变化监测。

此星光明博客 211

二维平面曼哈顿距离最小生成树模版

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const int inf = 1e8; const double eps =

九野的博客 2206

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

POJ3241 曼哈顿距离最小生成树

=.= 为什么莫队专题里面会有原理的题。。莫队是基于曼哈顿距离最小生成树提出的一种分块暴力(个人理解)算法,以后再说,先说这题。 因为不是图论选手,我图论非常菜,这题也是见都没见过,所以看了很多题解,来总结一下。 虽然说看了很多题解,但你搜搜就会发现,全部的讲解都是 一 模 一 样 的 !一点变动都没有的那种,所以我就直接写轮眼过来了。 http://poj.org/problem?id=3...

szudianchuang的博客 324

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

曼哈顿距离最小生成树与莫队算法(总结)

1 曼哈顿距离最小生成树 曼哈顿距离最小生成树问题可以简述如下: 给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价。 朴素的算法可以用O(N2)的Prim,或者处理出所有边做Kruskal,但在这里总边数有O(N2)条,所以Kruskal的复杂度变成了O(N2logN)。 但是事实上,真正有用的边远没有O(N2)条。我们考虑每个点会和其他一些什么样的点连边。可以得出这样一个结论,以一个点为原点建立直角坐标系,在每45度内只会向距离该点最近的一个点连边。 这个结论可以证明如

gyp0205的博客 1130

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

关于曼哈顿距离的最小生成树 POJ3241

题目地址 题目就是给你n个点 求n个点的曼哈顿距离的最小生成树 输出所有边中第k大的的边的权重。 n个点那么有有n∗(n−1)n*(n-1)条边如果采用朴素的prim算法建边就是O(n2)O(n^2)的复杂度,我们来考虑一下曼哈顿距离的特殊性,其实不是所有的边都需要,在建边的时候就可以去掉很多多余的边。 如图,对于给定的一些点我们选取一个点那么可以以这个点为原点建立一个直角坐标系,然后把每一个

touwangyi的博客 1199

为什么不可以使用哈曼顿距离_曼哈顿距离的最小生成树

最近测试有一道这样的题目,由于我以前看过怎么做,但是又不确定,所以就把做法的正确性证明了之后再做的。结果还是写挂了,只对了一个点。算法对于每个点,以它为中心把平面分成八个,每个面里面找一个距离它最近的点连一条边,然后做最小生成树即可。为什么这样是对的呢?如图,对于点\(O\)的其中一个平面,假设点\(A\)是离它最近的点,\(B\)点不是最近的点,我们可以证明,最小生成树里面可以不要\(OB\)这...

weixin_30402009的博客 186

曼哈顿距离的最小生成树

最近测试有一道这样的题目,由于我以前看过怎么做,但是又不确定,所以就把做法的正确性证明了之后再做的。结果还是写挂了,只对了一个点。 算法 对于每个点,以它为中心把平面分成八个,每个面里面找一个距离它最近的点连一条边,然后做最小生成树即可。 为什么这样是对的呢? 如图,对于点\(O\)的其中一个平面,假设点\(A\)是离它最近的点,\(B\)点不是最近的点,我们可以证明,最小生成树里面可以不要\(...

weixin_34400525的博客 131
上一篇: 关于Simpson积分
下一篇: [HNOI2011]卡农
OrpineX
博客等级 码龄17年 16粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值