列表

详情


NC236594. 差分构造

描述

牛牛获得了一个可重集合,集合中有 n 个整数,现在牛牛想要利用这 n 个数构造一颗最小生成树

这里的最小生成树的权重定义为每条树上边权值的和,每条树上边的权值为其所连接两个整数的差的绝对值。

显然这样的最小生成树可能不止一颗,所以你还需要输出所有最小生成树中最长树链最短的那一颗的最长树链长度。这里的树链长度指的是树链中结点的个数,与边权和点权无关。

在本题中,你需要输出最小生成树的权值,以及所有最小生成树中最长树链的最短长度

输入描述

第一行一个正整数 n 代表可重集中元素的个数。
第二行 n 个用空格分割的整数描述了集合中的元素。
保证:
 集合中元素的绝对值不超过 

输出描述

输出一行共两个整数代表答案。

示例1

输入:

13
0 -9 6 9 6 6 9 11 11 34 76 9 11

输出:

85 7

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 58ms, 内存消耗: 1192K, 提交时间: 2022-09-25 21:46:28

#include<bits/stdc++.h>
using namespace std;
int main(){
  int n;cin>>n;
  vector<int>a(n);
  for(int&v:a)cin>>v;
  if(n==1)cout<<"0 1",exit(0);
  sort(a.begin(),a.end());
  if(n==2)cout<<a[1]-a[0]<<" 2",exit(0);
  vector<int>b(a);b.erase(unique(b.begin(),b.end()),b.end());
  cout<<a[n-1]-a[0]<<' '<<b.size()+(a[0]==a[1])+(a[n-2]==a[n-1]);
}

C++(clang++ 11.0.1) 解法, 执行用时: 29ms, 内存消耗: 820K, 提交时间: 2023-07-21 22:44:31

#include<bits/stdc++.h>
using namespace std;
int n,a[100010],l,f;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    if(n>=2 && a[1]==a[2])f++; if(n>2 && a[n]==a[n-1])f++; 
    l=unique(a+1,a+n+1)-a-1;
    printf("%d %d\n",a[l]-a[1],l+f);
    return 0;
}

Python3 解法, 执行用时: 152ms, 内存消耗: 26916K, 提交时间: 2022-10-03 17:21:06

input()
a={}
for x in map(int,input().split()):
    if a.get(x):
        a[x]+=1
    else:
        a[x]=1
l=sorted(list(a.keys()))
if l[0]==l[-1]:
    print(0, 3 if a[l[0]]>2 else a[l[0]])
else:
    print(l[-1]-l[0],len(l)+int(a[l[0]]>1)+int(a[l[-1]]>1))

上一题