zoukankan      html  css  js  c++  java
  • 江西理工大学编程俱乐部 2328 Star

    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
    ",ret*k);
    117     return 0;
    118 }
  • 相关阅读:
    专访京东孙海波:大牛架构师养成记及电商供应链中区块链技术的应用(转)
    Python3 使用 matplotlib 画折线图
    JavaSE(十)之Map总结 (转)
    SciPy 安装不上?
    AI 也开源:50 大开源 AI 项目 (转)
    RabbitMQ的应用场景以及基本原理介绍 【转】
    mysql的水平拆分和垂直拆分 (转)
    MySQL在线大表DDL操作 (转)
    如何在原生工程中引入Cordova工程-for iOS 【转】
    Android 与 js 简单互调
  • 原文地址:https://www.cnblogs.com/tingtin/p/10542871.html
Copyright © 2011-2022 走看看