| 959 E

模拟kruskal的过程。每连接两个连通块时,所需的边权值为其中一个连通块的点的个数。

如图

因此对于n个点,所连接的第(n-1)条边,权值为(n/2),连接了两个点数为(n/2)的连通块。

#include<cstdio>
#include<algorithm>
using namespace std;
long long n;
long long ans;
long long x = 1;
int main()
{
    scanf("%lld",&n);
    while(n>1)
    {
        ans+=x*(n/2);
        n-=(n/2);
        x*=2;
    }
    printf("%lld",ans);
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/orange-/p/10889034.html
E