标签:long stream printf 世界 tac 资源 情况下 lib define
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 }
标签:long stream printf 世界 tac 资源 情况下 lib define
原文地址:https://www.cnblogs.com/tingtin/p/10542871.html