• codeforce468DIV2——D. Peculiar apple-tree


    题意
    给你一颗树,开始时每个结点都有一个小球,每一秒钟每个小球都往上滚一层,当两个球在同一个结点的时候会被消去,如果三个五个七个等在同一个结点的化消去后只剩一个。

    分析

    这对我来说就TM是英语阅读理解哇!赛场上读题读到懵逼啊!

    最容易想到的是一个O(N^2)的算法,最深由maxd层,从第一层枚举到maxd层然后进行DFS,来计算每一层的小球最后落下来还剩几个,但是这样肯定会被卡掉。然后就再想一个类似贪心的方法,直接dfs计算每一层的小球数量,如果偶数则全部会被消掉,如果是奇数则会剩一个。这样做为什么可以,因为可以忽略中间的过程,任何一层的小球最后都会到根。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <iostream>
     5 #include <vector>
     6 
     7 using namespace std;
     8 const int maxn=100000+10;
     9 vector<int>G[maxn];
    10 int n;
    11 int maxd=0;
    12 int num[maxn];
    13 void dfs(int u,int dep){
    14     num[dep]++;
    15     maxd=max(maxd,dep);
    16     if(G[u].size()==0)return ;
    17     for(int i=0;i<G[u].size();i++){
    18         int v=G[u][i];
    19         dfs(v,dep+1);
    20     }
    21     return ;
    22 }
    23 
    24 int main(){
    25     scanf("%d",&n);
    26     int a;
    27     for(int i=2;i<=n;i++){
    28         scanf("%d",&a);
    29         G[a].push_back(i);
    30     }
    31     dfs(1,1);
    32     int ans=0;
    33     for(int i=1;i<=n;i++){
    34         if(num[i]%2)
    35         ans++;
    36     }
    37     printf("%d ",ans);
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    HDU1506 Largest Rectangle in a Histogram(算竞进阶习题)
    洛谷P1073 最优贸易
    CH2101 可达性统计(算竞进阶习题)
    BZOJ1012 最大数maxnumber
    POJ 3764 The XOR Longest Path
    洛谷P4513 小白逛公园
    外边距叠加问题
    读JS高性能总结——DOM编程(一)
    DOM修改元素的方法总结
    DOM查找元素的方法总结
  • 原文地址:https://www.cnblogs.com/LQLlulu/p/8785073.html
Copyright © 2020-2023  润新知