• dfs+数学? 单


    问题 B: 单
    时间限制: 2 Sec 内存限制: 512 MB
    题目描述
    单车联通大街小巷.这就是出题人没有写题目背景的原因.
    对于一棵树,认为每条边长度为1,每个点有一个权值a[i].dis(u,v)为点u到v的最短路径的边数.dis(u,u)=0.对每个点求出一个重要程度.点x的重要程度b[x]定义为其他点到这个点的距离乘上对应的点权再求和. 即:b[x]=a[1]*dis(1,x)+a[2]*dis(2,x)+….+a[n]*dis(n,x)
    现在有很多树和对应的a数组,并求出了b数组.不幸的是,记录变得模糊不清了.幸运的是,树的形态完好地保存了下来,a数组和b数组至少有一个是完好无损的,但另一个数组完全看不清了.
    希望你求出受损的数组.多组数据.
    输入
    第一行输入一个T,表示数据组数。接下来T组数据。
    每组数据的第1行1个整数n表示树的点数.节点从1到n编号.
    接下来n-1行每行两个整数u,v表示u和v之间有一条边.
    接下来一行一个整数t,表示接下来数组的类型。
    t=0则下一行是a数组,t=1则下一行是b数组。
    接下来一行n个整数,表示保存完好的那个数组,第i个数表示a[i]或b[i]。
    输出
    T行,每组数据输出一行表示对应的a数组或b数组,数组的相邻元素用一个空格隔开。忽略行末空格和行尾回车.
    样例输入
    2
    2
    1 2
    1
    17 31
    2
    1 2
    0
    31 17
    样例输出
    31 17
    17 31
    提示

    对于100%的数据,T=5, 2<=n<=100000,1<=u,v<=n,保证给出的n-1条边形成一棵树
    对于100%的数据,t=0或t=1,1<=a[i]<=100,1<=b[i]<=10^9,t=1时保证给出的b数组对应唯一的一个a数组。
    对于100%的数据,单个输入文件不会包含超过2000000个整数,这段话可以理解为,你不必考虑输入输出对程序运行时间的影响。
    对于100%的数据,保证答案不会超过int能表示的范围

    共有两问,

    第一问:
    两遍深搜完美解决问题。第一遍求出自己子树之和(设为sum(i)),第二遍就要求b数组。
    b[i]=b[f[i]]-sum[i]+(tot-sum[i]);这个挺好证的,略。

    第二问:
    设自己子树之a[i]和sum[i].tot=Σa[i];
    b[i]-b[fa[i]]=(tot-sum[i])-sim[i]=tot-sum[i]*2;
    b[root]=Σsum[i];
    Σ(b[i]-b[fa[i]])(i!=root)+2*b[root]=tot*(n-1);
    从root向下推即可推出所有a[i].

  • 相关阅读:
    资源限制
    垃圾收集器
    GC日志
    happens-before
    maven相互依赖导致无法编译成功
    LVM-逻辑卷常用命令和示意图
    取消RAID5
    扩展RAID5的容量
    模拟RAID5损坏
    创建RAID5
  • 原文地址:https://www.cnblogs.com/QTY2001/p/7632685.html
Copyright © 2020-2023  润新知