题意:给出一颗满二叉树和边权,求使每颗子树的左右子树边权相同最少需要添加多少边权
自底向上不断递归,ans += 每颗子树的左右子树边权差,然后父亲节点将大的子树的边权记录给自身,不断更新到根节点
const int N = 5000;
int num[N];
int main()
{
int n;
while( ~scanf("%d", &n) )
{
int ans = 0;
int tot = 1 << n + 1;
for( int i = 2; i < tot; ++i )
scanf("%d", &num[i]);
for( int i = tot; i -= 2; )
{
if( num[i] > num[i|1] )
{
ans += num[i] - num[i|1];
num[i>>1] += num[i];
}
else
{
ans += num[i|1] - num[i];
num[i>>1] += num[i|1];
}
}
printf("%d\n", ans);
}
return 0;
}