首页 > 其他分享 >0829-T4 太空帝国

0829-T4 太空帝国

时间:2024-08-29 19:28:38浏览次数:15  
标签:0829 return 太空 point int T4 dsu ll id

0829-T4 太空帝国

题意

给定一个图有 \(n\) 个点,每个点的坐标为 \((x_i,y_i,z_i)\)。

点 \(i\) 和点 \(j\) 的距离为 \(\min(|x_i-x_j|,|y_i-y_j|,|z_i-z_j|)\)。

求该图的最小生成树。

思路

暴力建图不能通过。

对最小生成树有贡献的边只可能连在按 \(x\) 或 \(y\) 或 \(z\) 排序后的相邻点之间。

以按 \(x\) 排序为例子证明。

排序后,对于 \(a < b < c\),\(w(a,c)=w(a,b)+w(b,c)\)。

左右两边对于边权的贡献都一样,而右边多连了一个点,在最小生成树中更优。

证明 \(y,z\) 同理。

这样只有 \(O(n)\) 条边。

时间复杂度:\(O(n\log n)\)。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 3e5 + 5;
struct point {ll x, y, z, id;};
struct edge {ll x, y, z;};
struct DSU {
	int fa[N];
	void init(int n) {for (int i = 1; i <= n; i ++) fa[i] = i;}
	int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}
	void merge(int x, int y) {
		int fx = find(x), fy = find(y);
		if (fx == fy) return ;
		fa[fx] = fy;
	}
	bool same(int x, int y) {return find(x) == find(y);}
};
ll Abs(ll num) {return num > 0 ? num : -num;}
ll dis(point a, point b) {return min(Abs(a.x - b.x), min(Abs(a.y - b.y), Abs(a.z - b.z)));}
bool cmp(edge a, edge b) {return a.z < b.z;}
bool cmp1(point a, point b) {return a.x < b.x;}
bool cmp2(point a, point b) {return a.y < b.y;}
bool cmp3(point a, point b) {return a.z < b.z;}
int n; ll ans;
point p[N];
vector <edge> v;
DSU dsu;
int main() {
	cin >> n;
	for (int i = 1; i <= n; i ++) 
		cin >> p[i].x >> p[i].y >> p[i].z, p[i].id = i;
	sort(p + 1, p + n + 1, cmp1);
	for (int i = 1; i < n; i ++) 
		v.push_back({p[i].id, p[i + 1].id, dis(p[i], p[i + 1])});
	sort(p + 1, p + n + 1, cmp2);
	for (int i = 1; i < n; i ++) 
		v.push_back({p[i].id, p[i + 1].id, dis(p[i], p[i + 1])});
	sort(p + 1, p + n + 1, cmp3);
	for (int i = 1; i < n; i ++) 
		v.push_back({p[i].id, p[i + 1].id, dis(p[i], p[i + 1])});
	sort(v.begin(), v.end(), cmp);
	dsu.init(n);
	for (unsigned i = 0; i < v.size(); i ++) {
		ll x = v[i].x, y = v[i].y, z = v[i].z;
		if (dsu.same(x, y)) continue;
		dsu.merge(x, y);
		ans += z;
	}
	cout << ans << "\n";
	return 0;
}

标签:0829,return,太空,point,int,T4,dsu,ll,id
From: https://www.cnblogs.com/maniubi/p/18387437

相关文章

  • 0829-T3 公因数
    0829-T3公因数题意给定一个长度为\(n\)的序列,可以做若干次操作。每次操作选择两个数\(A,B\),选择\(A\)的一个质因数\(P\),将\(A\)变为\(\frac{A}{P}\),将\(B\)变为\(BP\)。求经过若干次操作后序列最大公因数的最大值,以及此情况下操作的最小次数。思路每次操作不会......
  • T240829 【用Liouville定理证明代数学基本定理】
    [T240829]代数学基本定理:在复平面上次数大于\(1\)的一元多项式至少有一个零点.引理(Liouville)有界整函数\(f(z)\)必为常数.证:设\(|f(z)|\)有上界\(M\).即\(\forallz\in\C,~|f(z)|\leM\).于是由Cauchy不等式,对\(\foralla\in\C\),有\[0\le|f'(a)|\le......
  • 0828-T4 聪聪与可可
    0828-T4聪聪与可可题意猫抓老鼠。猫每次会走到四周距离老鼠最近的点。若没抓到老鼠还会再走一次。老鼠每次会等概率向四周走一步,求猫抓到老鼠的期望时间。思路与处理出\(nxt_{i,j}\)表示猫在\(i\)老鼠在\(j\),猫下一步走到哪里。\(f_{i,j}\)表示猫在\(i\)老鼠在\(......
  • Vant4+Vue3 实现年月日时分时间范围控件
    <van-popup v-model:show="showDatePick" position="bottom" :overlay-style="{zIndex:1000}"> <van-picker-group title="时间范围" :tabs="['开始日期','结束日期']" @confirm="on......
  • GPT应用篇:如何用GPT4.0写一本言情小说?
    写一本言情小说对很多人来说是一件充满挑战但又非常有趣的事情。使用GPT-4.0,可以帮助你快速创作一部完整的小说,从构思大纲到撰写对话,再到完善细节,AI都可以提供有力的支持。以下是如何用GPT-4.0写一本言情小说的详细教程。1.确定小说的主题和设定言情小说通常围绕爱情故事......
  • Study Plan For Python - Part4
    格式化输出1.reprlib模块提供了一个定制化版本的repr()函数,用于缩略显示大型或深层嵌套的容器对象importreprlibreprlib.repr(set('fantabulouslywonderificentamazingness'))#可迭代对象,输出"{'a','b','c','d','e','f',.......
  • Part4-DOM学习笔记-获取元素属性及节点操作
    6.获取元素属性6.1获取元素属性获取元素的属性有两种方式:element.属性:获取内置属性值,元素本身自带的属性不能获取自定义属性代码示例如console.log(div.id)element.getAttribute(‘属性’):可以获取内置属性值可以获取自定义属性代码示例如下:console.......
  • C++竞赛初阶L1-14-第六单元-数组(31~33课)543: T456473 年龄与疾病
    题目内容某医院进行一项研究,想知道某项疾病是否与年龄有关。因此对以往的诊断记录进行整理,统计0-18、19-35、36-60、61及以上这四个年龄段的患者人数占总患者人数的比例。输入格式输入共 2 行。第一行包含一个整数 N(0<n≤100),表示总患者人数。第二行包含 N 个......
  • pve(‌Proxmox Virtual Environment)-GPT4回答的关于CT容器的一些问题
    文章目录前言一、pve中的ct虚拟机是干嘛用的?**CT(容器)与VM(虚拟机)的区别****在PVE中使用CT的优点**二、怎么使用呢,比如我要启动一个nginx容器?1.**创建一个LXC容器**2.**启动并进入容器**3.**在容器中安装Nginx**4.**访问Nginx**5.**管理容器**三、创建一......
  • vant3升级vant4后,使用Toast、Dialog报样式不存在异常解决方法
    异常现象:vant3升级vant4,直接采用v4的方法使用showToast/showDialog,但直接就报错了,如下:[vite]Internalservererror:Failedtoresolveimport"E:/git_sh/project_code/node_modules/vant/es/show-confirm-dialog/style"from"src\service\index.ts".Doesthefile......