zoukankan      html  css  js  c++  java
  • CF1311E Construct the Binary Tree

    题面

    给定树的节点数n和d,构造一颗二叉树,使所有节点的的深度和为d

    容易得出n个节点的二叉树每个节点深度的总和最大为n*(n-1)/2,最小值为满二叉树的情况

    于是就可以愉快地判断答案是否存在啦,然后还得构造出一个合法的答案qwq

    我的方法是先弄成一条链再进行调整

    反正数据不大,不如简单点每次只调整一个 没有儿子 的节点,使其深度减少1(用c数组表示一个节点的儿子个数)

    具体做法就是先枚举一个没有儿子的节点x,然后枚举一个儿子不满且深度比x小2的节点y,将x移动为y的儿子,移动后要更新一些信息(看代码)

    这样做看似复杂度爆炸(n^3),但事实上由于数据范围的约束,当n较大时d无法满足大于可能最小值的条件,并不用执行之后复杂度爆炸的过程 >_<

    稍稍优化一下,如果一个节点已经无法移动(深度更小的位置已经满了),就做一个标记,避免下次又选到这个点做无用功

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 2e5 + 5;
    int dep[N], fa[N], c[N], k[N];
    signed main() {
        int t; scanf ("%d", &t);
        while (t--) {
            int n, d; scanf ("%d %d", &n, &d);
            if (d > n * (n - 1) / 2) { puts ("NO"); continue; }
            int tmp = n - 1, mn = 0;
            for (int i = 1; ; ++i) {
                if (tmp < (1 << i)) { mn += i * tmp; break; }
                tmp -= (1 << i), mn += i * (1 << i);
            } if (d < mn) { puts ("NO"); continue; } puts ("YES");
            for (int i = 1; i <= n; ++i)
                fa[i] = i - 1, dep[i] = i - 1, c[i] = 1, k[i] = 0; c[n] = 0;
            int now = n * (n - 1) / 2;
            while (now > d) {
                int p, ok = 0, tmp;
                for (int i = 1; i <= n; ++i) if (!k[i] && !c[i]) { p = i; break; }
                for (int i = 1; i <= n; ++i)
                    if (c[i] < 2 && dep[i] == dep[p] - 2) { tmp = i; ok = 1; break;}
                if (!ok) { k[p] = 1; continue; }    //如果节点已经无法移动就打个标记,防止TLE
                --c[fa[p]], ++c[tmp], --dep[p], fa[p] = tmp, --now;  //更新节点信息
            } for (int i = 2; i <= n; ++i) printf ("%d ", fa[i]); puts ("");
        } return 0;
    }
    
  • 相关阅读:
    Delphi Try Except 实例
    如何有效地让一个“ParentFont = False”子控件使用与父母相同的字体名称?
    WPF的本质:数据和行为
    WPF-触发器
    WPF TextBox 验证输入
    wpf数据绑定更新通知
    asp.net *.ashx类型的文件使用说明
    asp.net 定时间点执行任务的简易解决办法
    asp.net 页面延时五秒,跳转到另外的页面
    Asp.net 基于Cookie简易的权限判断
  • 原文地址:https://www.cnblogs.com/whx666/p/12670503.html
Copyright © 2011-2022 走看看