Om Nom and Dark Park

传送门

题目大意:一颗深度为n+1的满二叉树,根结点编号为1。现在要增加一些边的边权,使根结点到每个叶子节点所经过的边权之和相等。求增加的最小值。

分析:对于一个节点到两个子节点,若两边边权不相等,则需要增加较少的一边的边权,使其相等。从而可以自下而上,依次求出两个子节点到根节点边权的差值,累加即可。

每次求出差值后,还应当将较大的边权累加到其父节点到其祖父结点的边权上,保证一致性。

#include<bits/stdc++.h>
using namespace std;
#define lson i<<1
#define rson i<<1|1
int a[1<<11];
int main()
{
    int i,n,l;
    scanf("%d",&n);
    l=(1<<(n+1))-1;
    for(i=2;i<=l;++i) scanf("%d",&a[i]);
    int ans=0;
    for(i=(l>>1);i>=1;--i)
    {
        a[i]+=max(a[lson],a[rson]);
        ans+=abs(a[lson]-a[rson]);
    }
    printf("%d\n",ans);
    return 0;
}

你可能感兴趣的:(Om Nom and Dark Park)