模拟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; }