1003 可爱の星空 递推 分治
链接:https://ac.nowcoder.com/acm/contest/24213/1003
来源:牛客网
题目描述
“当你看向她时,有细碎星辰落入你的眼睛,真好。”——小可爱
在一个繁星闪烁的夜晚,卿念和清宇一起躺在郊外的草地上,仰望星空。
星语心愿,他们,想把这片星空的星星,连成一棵漂亮的树,将这美好的景色记录下来。
现在,天上共有n颗星星,编号分别为1,2.....n,一开始任何两个点之间都没有边连接。
之后,他们两个想在在(u,v)之间连无向边,需要付出|u联通块大小-v联通块大小|的代价。
他们两个想用最少的代价来使这n个点联通,所以他们想知道最小代价是多少。
(多组数据
输入描述:
第一行一个正整数,表示数据组数T
接下来T行每行一个正整数,表示询问的n
输出描述:
T行,每行一个数表示答案
示例1
备注:
对于20%的数据,T<=2,n<=10
对于40%的数据,T<=10,n<=1000
对于60%的数据,T<=100000,n<=100000
对于另外40%的数据,T=1,n<=1000000000000
分析:
当两个星星大小相等,价值抵消,价值不相等,加上差值,那尽量平均分配就可以了,分治处理
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
long long solve(int n) {
if(n < 3) {
return 0;
}
if(n & 1) {
return solve(n / 2) + solve(n / 2 + 1) + 1;
} else {
return solve(n / 2) * 2;
}
}
signed main() {
int t;
cin>>t;
while(t -- ) {
cin>>n;
cout<<solve(n)<<endl;;
}
}