面试向hihoCoder 1994 树与落叶

Posted patt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试向hihoCoder 1994 树与落叶相关的知识,希望对你有一定的参考价值。

题目链接

Implementation

    int n, q; scan(n,q);

    vi p(n + 1);
    vi nson(n + 1);

    up (i, 1, n) 
        scan(p[i]);
        nson[p[i]]++;
    

    vi leaf;
    up (i, 1, n) 
        if (nson[i] == 0) leaf.pb(i);
    

    vi cnt;
    cnt.pb(n);

    for (; !leaf.empty(); )  
        cnt.pb(cnt.back() - SZ(leaf));
        vi tmp;
        FOR (x, leaf) 
            --nson[p[x]];
            if (nson[p[x]] == 0 && p[x] != 0) 
                tmp.pb(p[x]);
             
        
        leaf = std::move(tmp);
    


    rep (q) 
        int x; scan(x);


        // <= x
        auto i = lower_bound(all(cnt), x, greater<int>()) - cnt.begin();

        debug(i);
        if (i == SZ(cnt)) 
            println(SZ(cnt));
        
        else if (i == 0) 
            println(i + 1);
        
        else 
            int d1 = x - cnt[i];
            int d2 = cnt[i - 1] - x;
            println(d2 <= d1 ? i : i + 1);
        
    

Note

这道题的实现要点是如何维护每天的叶子集合。

key observation: 对于 $i \ge 3$,第 $i$ 天掉落的叶子一定是某些第 $i - 1$ 天掉落的叶子的父亲。

以上是关于面试向hihoCoder 1994 树与落叶的主要内容,如果未能解决你的问题,请参考以下文章

面试题36. 二叉搜索树与双向链表

面试题36. 二叉搜索树与双向链表

经典面试题(二十三)--二叉树与双向链表

剑指Offer---面试题27:二叉搜索树与双向链表

剑指Offer面试题27(Java版):二叉搜索树与双向链表

树与二叉树数据结构详解