2328: Star
时间限制: C/C++ 1 s Java/Python 3 s 内存限制: 128 MB 答案正确: 9 提交: 26
题目描述
31世纪,人类世界的科技已经发展到了空前的高度,星际移民,星际旅游早已经不再是问题。人类已经掌握了开发星系的能力。但是,无论发展到何种地步,资源一直是人们关注的重点。一种新的能源被人类掌握,通过它可以搭建虫洞,实现超光年传输。发展武器。但是虽然这种物质在宇宙海量的存在着,但它对于宇宙的稳定是至关重要的,若过量消耗这种物质,对于宇宙的稳定,星系与星系之间以及星系内部的微妙平衡都会产生巨大的影响。这种物质就是暗物质。
-----《宇宙百科》节选
现在,你所在的星系下有n个主星球居住着人民。为了星系内部的稳定与和平发展,现在需要在n个主星球之间建立空间虫洞,众所周知建立虫洞要消耗大量的暗物质,因此,你想要在n个主星球之间建立联系的情况下尽量少的消耗暗物质。目前你已经知道的是,建立虫洞所需要消耗的暗物质与两个星球之间的距离成正比,比例系数为k。并且,两个星球之间的距离为空间缩点距离。每个星球有它自己的三维物理坐标。不过,现在有一个好消息。你所在的星系掌握了一项新的技术,空间奇点压缩,简单来说就是降维,但是由于技术发展初期不够成熟,只能压缩一维。并且,任意两个主星球之间都可以选择是否进行空间奇点压缩。现在,你想知道,在这n个主星球之间建立连接需要花费的最少暗物质是多少。
空间缩点距离:设两个n维坐标a(x1,x2,x3,,,,xn),b(y1,y2,y3,y4,,,yn).设距离为s,则s=abs((x1+x2+x3+…+xn)−(y1+y2+y3+…+yn));
----以上内容纯属瞎扯,请忽略其真实性
输入
第一行两个整数n和k。(1≤n≤105,1≤k≤103)
接下开n行,每行三个整数x,y,z,其中第i行表示第i个星球在星系中的物理坐标。数据保证没有两个星球处于同一个位置上。(1≤x,y,z≤106)
输出
n个主星球之间建立连接需要花费的最少暗物质。
样例输入
3 2
1 1 6
1 2 9
3 20 8
样例输出
4
提示
样例说明:
星球1和星球2之间压缩第三维
星球2和星球3之间压缩第二维
来源
Ocean_star_T
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <string>
5 #include <algorithm>
6 #include <utility>
7 #include <vector>
8 #include <map>
9 #include <queue>
10 #include <stack>
11 #include <cstdlib>
12 #include <cmath>
13 typedef long long ll;
14 #define lowbit(x) (x&(-x))
15 #define ls l,m,rt<<1
16 #define rs m+1,r,rt<<1|1
17 using namespace std;
18 #define pi acos(-1)
19 #define P pair<ll,ll>
20 const ll N = 1e5+1000;
21 ll n,k;
22 ll cnt;
23 int fa[N];
24 void init()
25 {
26 for(int i =0;i<n;i++){
27 fa[i] = i;
28 }
29 cnt=0;
30 }
31 struct Nod{
32 ll x,y,z,num;
33 }nod[N];
34 struct Edge{
35 ll fr,to,val;
36 }e[N*5];
37 bool cmp1(Nod a,Nod b)
38 {
39 return a.y+a.z<b.y+b.z;
40 }
41 bool cmp2(Nod a,Nod b)
42 {
43 return a.x+a.z<b.x+b.z;
44 }
45 bool cmp3(Nod a,Nod b)
46 {
47 return a.x+a.y<b.x+b.y;
48 }
49 bool cmp4(Nod a,Nod b)
50 {
51 return a.x+a.y+a.z<b.x+b.y+b.z;
52 }
53 bool cmp5(Edge a,Edge b)
54 {
55 return a.val<b.val;
56 }
57 int find(int x)
58 {
59 return fa[x]=(x==fa[x]?x:find(fa[x]));
60 }
61 ll prim()
62 {
63 sort(e,e+cnt,cmp5);
64 int ans=n;
65 ll sum=0;
66 for(int i =0;i<cnt;i++)
67 {
68 if(ans>1){
69 int x=find(e[i].fr),y=find(e[i].to);
70 if(x!=y){
71 fa[x] = y;
72 ans--;
73 sum+=e[i].val;
74 }
75 }
76 }
77 return sum;
78 }
79 int main()
80 {
81 scanf("%lld%lld",&n,&k);
82 for(int i =0;i<n;i++){
83 scanf("%lld%lld%lld",&nod[i].x,&nod[i].y,&nod[i].z);
84 nod[i].num=i;
85 }
86 init();
87 sort(nod,nod+n,cmp1);
88 for(int i =0;i<n-1;i++)
89 {
90 e[cnt].fr=nod[i].num;
91 e[cnt].to=nod[i+1].num;
92 e[cnt++].val=abs((nod[i].y+nod[i].z)-(nod[i+1].y+nod[i+1].z));
93 }
94 sort(nod,nod+n,cmp2);
95 for(int i =0;i<n-1;i++)
96 {
97 e[cnt].fr=nod[i].num;
98 e[cnt].to=nod[i+1].num;
99 e[cnt++].val=abs((nod[i].x+nod[i].z)-(nod[i+1].x+nod[i+1].z));
100 }
101 sort(nod,nod+n,cmp3);
102 for(int i =0;i<n-1;i++)
103 {
104 e[cnt].fr=nod[i].num;
105 e[cnt].to=nod[i+1].num;
106 e[cnt++].val=abs((nod[i].x+nod[i].y)-(nod[i+1].x+nod[i+1].y));
107 }
108 sort(nod,nod+n,cmp4);
109 for(int i =0;i<n-1;i++)
110 {
111 e[cnt].fr=nod[i].num;
112 e[cnt].to=nod[i+1].num;
113 e[cnt++].val=abs((nod[i].x+nod[i].y+nod[i].z)-(nod[i+1].x+nod[i+1].y+nod[i+1].z));
114 }
115 ll ret = prim();
116 printf("%lld\n",ret*k);
117 return 0;
118 }