• Codeforces ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS


    题目链接:

    http://codeforces.com/contest/526/problem/B

    题意:

    n表示几层边
    使从根走到每个叶子所要的花费都相同,问最少得增加多少边权?

    题解:

    把每个点与父节点的边 和 这个点 编号相同, 这样就使得每条边的编号是它儿子边的编号的2倍
    DFS,自底往上,预处理前缀和
    然后ans加上左右叶子的差值,然后一直跑DFS就是了

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define mem(a) memset(a,0,sizeof(a))
     5 #define mp(x,y) make_pair(x,y)
     6 const int INF = 0x3f3f3f3f;
     7 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     8 inline ll read(){
     9     ll x=0,f=1;char ch=getchar();
    10     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    11     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    12     return x*f;
    13 }
    14 //////////////////////////////////////////////////////////////////////////
    15 const int maxn = 1e4+10;
    16 ll a[maxn];
    17 ll n,k,dp[maxn];
    18 
    19 void read_dfs(int x){
    20     if(x > k) return ;
    21 
    22     read_dfs(2*x);
    23     read_dfs(2*x+1);
    24     a[2*x] += max(a[2*x * 2], a[2*x*2 + 1]); // 对边累加,前缀和
    25     a[2*x+1] += max(a[(2*x+1)*2],a[(2*x+1)*2+1]);
    26 }
    27 
    28 ll dfs(ll x){
    29     if(dp[x]) return dp[x];
    30     if(x > k) return 0;
    31 
    32     dp[x] = dfs(x*2)+dfs(x*2+1) + abs(a[x*2]-a[x*2+1]); // 对x这个点更新答案
    33     return dp[x];
    34 }
    35 
    36 int main(){
    37     cin >> n;int c=0;
    38     k = pow(2,n);
    39     for(int i=1; i<=n; i++)
    40         for(int j=0; j<pow(2,i); j++){
    41             int p = pow(2,i)+j;
    42             cin >> a[p];
    43         }
    44 
    45     read_dfs(1);
    46 
    47     cout << dfs(1) << endl;
    48 
    49     return 0;
    50 }
    51 
    52 //http://codeforces.com/contest/526/problem/B
  • 相关阅读:
    团队博客18
    团队博客17
    团队博客16
    团队博客15
    团队博客14
    团队博客13
    团队博客12
    课堂作业08--MVC框架的具体应用
    课堂作业07--MVC框架
    课堂作业06--23中设计模式
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827692.html
Copyright © 2020-2023  润新知