题目描述

单车联通大街小巷.这就是出题人没有写题目背景的原因.

对于一棵树,认为每条边长度为 \(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\)能表示的范围

接下来的表格中描述了每个测试点的具体特征。每个测试点的\(5\)组数据均符合表格中对应的特征。

分析

默认 \(1\) 号节点为根节点

我们设 \(sum[i]\) 为以 \(i\) 为根的子树中 \(a\) 数组的和

当 \(t=0\) 时,显然是一个换根 \(DP\),有 \(b[now]=b[fa]+sum[1]-sum[now]-sum[now]\)

当 \(t \neq 0\) 时,如果数据范围较小的话可以进行高斯消元

但是这道题的 \(n\) 比较大,所以我们只能推式子

由换根 \(DP\) 的式子,我们可以得到对于除\(1\)之外的任何节点都有 \(b[now]-b[fa]=sum[1]-2sum[now]\)

我们把这些式子相加,可以得到 \(x_1b[1]+x_2b[2]+...+x_nb[n]=(n-1)sum[1]-2 \sum_{i=2}^nsum[now]\)

对于左边这一堆,我们可以 \(dfs\) 求出每一个节点对应的系数 \(x_i\),从而得到左边的值

对于右边的 \(\sum_{i=2}^nsum[now]\),其实就是 \(b[1]\)

因为我们在换根 \(DP\) 的第一个 \(dfs\) 时会有 \(b[1]= \sum_{u=son\ of\ 1}sum[u]+g[u]\)

其中 \(g[u]=\sum_{v=son\ of\ u}sum[v]+g[v]\)

当递归到叶子节点时,会有\(g[u]=sum[u]=a[u]\)

所以\(\sum_{i=2}^nsum[now]=b[1]\)

我们带入上面的式子就可以求出 \(sum[1]\)

进行一遍 \(dfs\) 可以求出所有节点的\(sum\)值

再进行一遍 \(dfs\) 就可以求出所有节点的\(a\)值

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<iostream>
  6. #define int long long
  7. inline int read(){
  8. int x=0,fh=1;
  9. char ch=getchar();
  10. while(ch<'0' || ch>'9'){
  11. if(ch=='-') fh=-1;
  12. ch=getchar();
  13. }
  14. while(ch>='0' && ch<='9'){
  15. x=(x<<1)+(x<<3)+(ch^48);
  16. ch=getchar();
  17. }
  18. return x*fh;
  19. }
  20. const int maxn=1e6+5;
  21. int n,head[maxn],tot=1,t;
  22. struct asd{
  23. int to,next;
  24. }b[maxn];
  25. void ad(int aa,int bb){
  26. b[tot].to=bb;
  27. b[tot].next=head[aa];
  28. head[aa]=tot++;
  29. }
  30. void clr(){
  31. memset(head,-1,sizeof(head));
  32. memset(&b,0,sizeof(b));
  33. tot=1;
  34. }
  35. int zd[maxn];
  36. int f[maxn],g[maxn],siz[maxn],sum;
  37. void dfs1(int now,int fa){
  38. siz[now]=zd[now];
  39. for(int i=head[now];i!=-1;i=b[i].next){
  40. int u=b[i].to;
  41. if(u==fa) continue;
  42. dfs1(u,now);
  43. g[now]+=g[u]+siz[u];
  44. siz[now]+=siz[u];
  45. }
  46. }
  47. void dfs2(int now,int fa){
  48. if(now==1){
  49. f[now]=g[now];
  50. }
  51. for(int i=head[now];i!=-1;i=b[i].next){
  52. int u=b[i].to;
  53. if(u==fa) continue;
  54. f[u]=f[now]+sum-siz[u]-siz[u];
  55. dfs2(u,now);
  56. }
  57. }
  58. void solve1(){
  59. memset(siz,0,sizeof(siz));
  60. memset(f,0,sizeof(f));
  61. memset(g,0,sizeof(g));
  62. sum=0;
  63. for(int i=1;i<=n;i++){
  64. sum+=zd[i];
  65. }
  66. dfs1(1,0);
  67. dfs2(1,0);
  68. for(int i=1;i<=n;i++){
  69. printf("%lld ",f[i]);
  70. }
  71. printf("\n");
  72. }
  73. int nans,ncnt,xs[maxn];
  74. void dfs3(int now,int fa){
  75. for(int i=head[now];i!=-1;i=b[i].next){
  76. int u=b[i].to;
  77. if(u==fa) continue;
  78. dfs3(u,now);
  79. xs[u]++;
  80. xs[now]--;
  81. }
  82. }
  83. void dfs4(int now,int fa){
  84. for(int i=head[now];i!=-1;i=b[i].next){
  85. int u=b[i].to;
  86. if(u==fa) continue;
  87. siz[u]=(siz[1]+zd[now]-zd[u])/2;
  88. dfs4(u,now);
  89. }
  90. }
  91. void dfs5(int now,int fa){
  92. for(int i=head[now];i!=-1;i=b[i].next){
  93. int u=b[i].to;
  94. if(u==fa) continue;
  95. siz[now]-=siz[u];
  96. dfs5(u,now);
  97. }
  98. }
  99. void solve2(){
  100. memset(siz,0,sizeof(siz));
  101. memset(xs,0,sizeof(xs));
  102. dfs3(1,0);
  103. nans=0;
  104. for(int i=1;i<=n;i++){
  105. nans+=(1LL*zd[i]*xs[i]);
  106. }
  107. siz[1]=nans-ncnt*zd[1];
  108. siz[1]+=2*zd[1];
  109. siz[1]/=(n-1);
  110. dfs4(1,0);
  111. dfs5(1,0);
  112. for(int i=1;i<=n;i++){
  113. printf("%lld ",siz[i]);
  114. }
  115. printf("\n");
  116. }
  117. signed main(){
  118. freopen("single.in","r",stdin);
  119. freopen("single.out","w",stdout);
  120. t=read();
  121. while(t--){
  122. clr();
  123. n=read();
  124. int aa,bb,op;
  125. for(int i=1;i<n;i++){
  126. aa=read(),bb=read();
  127. ad(aa,bb);
  128. ad(bb,aa);
  129. }
  130. op=read();
  131. for(int i=1;i<=n;i++){
  132. zd[i]=read();
  133. }
  134. if(op==0){
  135. solve1();
  136. } else {
  137. solve2();
  138. }
  139. }
  140. return 0;
  141. }

晚间测试3 B. 单(single)的更多相关文章

  1. 7.27 NOIP模拟测试9 随 (rand)+单(single)+题(problem)

    T1 随 (rand) dp+矩阵优化+原根 看着题解懵了一晚上加一上午,最后还是看了DeepinC的博客才把暴力码出来,正解看得一知半解,循环矩阵也不太明白,先留坑吧.暴力里用二维矩阵快速幂会tle ...

  2. [20190727NOIP模拟测试9]单(single) 题解(树上dp)

    啊啊啊啊啊啊啊啊考场上差一点就A掉了5555 千里之堤溃于蚁穴……鬼知道最后一步那么显然的柿子我为什么没考虑用上…… 观察数据范围可知,出题人期望我们想出一个$O(n)$的做法 当然也有可能是$O(n ...

  3. PuTsangTo-单撸游戏开发02 测试场景与单轴移动

    且不说立项与设计阶段的工作量,一个完整的游戏在开发阶段设计的职责范围也是很广,还有个大问题就是PuTsangTo项目也是本人在边学边做,截止目前还是满满的无从下手的感觉,一方面是技能与经验不足,另一方 ...

  4. Django 模版语法 测试环境 ORM单表查询

    模版语法 传值 视图函数向前端html页面传值,基本上所有的数据类型都可以渲染在前端页面上. views.py from django.shortcuts import render, redirec ...

  5. 晚间测试13 A. Dove 打扑克 vector +模拟

    题目描述 分析 这道题比较关键的一点就是要看出最终牌数的种类数不会超过 \(\sqrt{n}\) 种 知道了这个性质我们就可以用 \(vector\) 维护一个有序的序列 \(vector\) 中存放 ...

  6. iOS开发:XCTest单元测试(附上一个单例的测试代码)

    测试驱动开发并不是一个很新鲜的概念了.在我最开始学习程序编写时,最喜欢干的事情就是编写一段代码,然后运行观察结果是否正确.我所学习第一门语言是c语言,用的最多的是在算法设计上,那时候最常做的事情就是编 ...

  7. Web测试的常用测试用例与知识

    1. Web测试中关于登录的测试 2. 搜索功能测试用例设计 3. 翻页功能测试用例 4. 输入框的测试 5. Web测试的常用的检查点 6. 用户及权限管理功能常规测试方法 7. Web测试之兼容性 ...

  8. Android-monkey稳定性测试(多台设备同时进行)

                                       1.目的(原创文章,转载请注明出处-) 主要为指引开展android平台应用的稳定性测试,尽可能地在应用发布前发现crash及an ...

  9. web测试常用的用例及知识

      1.      Web测试中关于登录的测试... 1 2.      搜索功能测试用例设计... 2 3.      翻页功能测试用例... 3 4.      输入框的测试... 5 5.    ...

随机推荐

  1. 滴滴Ceph分布式存储系统优化之锁优化

    桔妹导读:Ceph是国际知名的开源分布式存储系统,在工业界和学术界都有着重要的影响.Ceph的架构和算法设计发表在国际系统领域顶级会议OSDI.SOSP.SC等上.Ceph社区得到Red Hat.SU ...

  2. Linux下Vim常用操作

    linux下Vim的常用操作 linux ​ 首先\(ctrl+Alt+t\)打开小框框 ​ \(./\):相当于手机上的\(home\)键 ​ \(ls\):当前文件夹的东东 ​ \(mkdir\) ...

  3. 【转】mac上安装gradle

    http://www.douban.com/note/311599602/ 首先,先download最新版本的gradle,网址如下:http://www.gradle.org/get-started ...

  4. 基于canal的client-adapter数据同步必读指南

    本文将介绍canal项目中client-adapter的使用,以及落地生产中需要考虑的可靠性.高可用与监控报警.(基于canal 1.1.4版本) canal作为mysql的实时数据订阅组件,实现了对 ...

  5. Activiti7 流程变量(理论)

    什么是流程变量 流程变量在Activiti中是一个非常重要的角色,流程运转有时需要靠流程变量,业务系统和Activiti结合时少不了流程变量,流程变量就是Activiti在管理工作流时根据管理需要而设 ...

  6. Tooltip鼠标hover放上时文字提示

    使用content属性来决定hover时的提示信息. 由placement属性决定展示效果: placement属性值为:                 方向-对齐位置: 四个方向:top.left ...

  7. 循环删除list的方法

    错误的方法: 正确的方法:

  8. [剑指Offer]17-打印从1到最大的n位数(递归)

    题目 如题,输入n,则从1打印至99. 题解 考虑到n比较大会有大数问题,所以使用字符数组存储数. 由题可用递归求n位全排列,即为所得. 具体地,用临时字符数组用来存答案,每次递归填好一位,都填好后输 ...

  9. 《Offer一箩筐》2W字总结面试套路14问——不给例子的教程都是耍流氓!!

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」. 如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力! Hi~ 这里是 ...

  10. spring cloud微服务快速教程之(十二) 分布式ID解决方案(mybatis-plus篇)

    0-前言 分布式系统中,分布式ID是个必须解决的问题点: 雪花算法是个好方式,不过不能直接使用,因为如果直接使用的话,需要配置每个实例workerId和datacenterId,在微服务中,实例一般动 ...