晚间测试3 B. 单(single)
题目描述
单车联通大街小巷.这就是出题人没有写题目背景的原因.
对于一棵树,认为每条边长度为 \(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\)值
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define int long long
inline int read(){
int x=0,fh=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*fh;
}
const int maxn=1e6+5;
int n,head[maxn],tot=1,t;
struct asd{
int to,next;
}b[maxn];
void ad(int aa,int bb){
b[tot].to=bb;
b[tot].next=head[aa];
head[aa]=tot++;
}
void clr(){
memset(head,-1,sizeof(head));
memset(&b,0,sizeof(b));
tot=1;
}
int zd[maxn];
int f[maxn],g[maxn],siz[maxn],sum;
void dfs1(int now,int fa){
siz[now]=zd[now];
for(int i=head[now];i!=-1;i=b[i].next){
int u=b[i].to;
if(u==fa) continue;
dfs1(u,now);
g[now]+=g[u]+siz[u];
siz[now]+=siz[u];
}
}
void dfs2(int now,int fa){
if(now==1){
f[now]=g[now];
}
for(int i=head[now];i!=-1;i=b[i].next){
int u=b[i].to;
if(u==fa) continue;
f[u]=f[now]+sum-siz[u]-siz[u];
dfs2(u,now);
}
}
void solve1(){
memset(siz,0,sizeof(siz));
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
sum=0;
for(int i=1;i<=n;i++){
sum+=zd[i];
}
dfs1(1,0);
dfs2(1,0);
for(int i=1;i<=n;i++){
printf("%lld ",f[i]);
}
printf("\n");
}
int nans,ncnt,xs[maxn];
void dfs3(int now,int fa){
for(int i=head[now];i!=-1;i=b[i].next){
int u=b[i].to;
if(u==fa) continue;
dfs3(u,now);
xs[u]++;
xs[now]--;
}
}
void dfs4(int now,int fa){
for(int i=head[now];i!=-1;i=b[i].next){
int u=b[i].to;
if(u==fa) continue;
siz[u]=(siz[1]+zd[now]-zd[u])/2;
dfs4(u,now);
}
}
void dfs5(int now,int fa){
for(int i=head[now];i!=-1;i=b[i].next){
int u=b[i].to;
if(u==fa) continue;
siz[now]-=siz[u];
dfs5(u,now);
}
}
void solve2(){
memset(siz,0,sizeof(siz));
memset(xs,0,sizeof(xs));
dfs3(1,0);
nans=0;
for(int i=1;i<=n;i++){
nans+=(1LL*zd[i]*xs[i]);
}
siz[1]=nans-ncnt*zd[1];
siz[1]+=2*zd[1];
siz[1]/=(n-1);
dfs4(1,0);
dfs5(1,0);
for(int i=1;i<=n;i++){
printf("%lld ",siz[i]);
}
printf("\n");
}
signed main(){
freopen("single.in","r",stdin);
freopen("single.out","w",stdout);
t=read();
while(t--){
clr();
n=read();
int aa,bb,op;
for(int i=1;i<n;i++){
aa=read(),bb=read();
ad(aa,bb);
ad(bb,aa);
}
op=read();
for(int i=1;i<=n;i++){
zd[i]=read();
}
if(op==0){
solve1();
} else {
solve2();
}
}
return 0;
}
晚间测试3 B. 单(single)的更多相关文章
- 7.27 NOIP模拟测试9 随 (rand)+单(single)+题(problem)
T1 随 (rand) dp+矩阵优化+原根 看着题解懵了一晚上加一上午,最后还是看了DeepinC的博客才把暴力码出来,正解看得一知半解,循环矩阵也不太明白,先留坑吧.暴力里用二维矩阵快速幂会tle ...
- [20190727NOIP模拟测试9]单(single) 题解(树上dp)
啊啊啊啊啊啊啊啊考场上差一点就A掉了5555 千里之堤溃于蚁穴……鬼知道最后一步那么显然的柿子我为什么没考虑用上…… 观察数据范围可知,出题人期望我们想出一个$O(n)$的做法 当然也有可能是$O(n ...
- PuTsangTo-单撸游戏开发02 测试场景与单轴移动
且不说立项与设计阶段的工作量,一个完整的游戏在开发阶段设计的职责范围也是很广,还有个大问题就是PuTsangTo项目也是本人在边学边做,截止目前还是满满的无从下手的感觉,一方面是技能与经验不足,另一方 ...
- Django 模版语法 测试环境 ORM单表查询
模版语法 传值 视图函数向前端html页面传值,基本上所有的数据类型都可以渲染在前端页面上. views.py from django.shortcuts import render, redirec ...
- 晚间测试13 A. Dove 打扑克 vector +模拟
题目描述 分析 这道题比较关键的一点就是要看出最终牌数的种类数不会超过 \(\sqrt{n}\) 种 知道了这个性质我们就可以用 \(vector\) 维护一个有序的序列 \(vector\) 中存放 ...
- iOS开发:XCTest单元测试(附上一个单例的测试代码)
测试驱动开发并不是一个很新鲜的概念了.在我最开始学习程序编写时,最喜欢干的事情就是编写一段代码,然后运行观察结果是否正确.我所学习第一门语言是c语言,用的最多的是在算法设计上,那时候最常做的事情就是编 ...
- Web测试的常用测试用例与知识
1. Web测试中关于登录的测试 2. 搜索功能测试用例设计 3. 翻页功能测试用例 4. 输入框的测试 5. Web测试的常用的检查点 6. 用户及权限管理功能常规测试方法 7. Web测试之兼容性 ...
- Android-monkey稳定性测试(多台设备同时进行)
1.目的(原创文章,转载请注明出处-) 主要为指引开展android平台应用的稳定性测试,尽可能地在应用发布前发现crash及an ...
- web测试常用的用例及知识
1. Web测试中关于登录的测试... 1 2. 搜索功能测试用例设计... 2 3. 翻页功能测试用例... 3 4. 输入框的测试... 5 5. ...
随机推荐
- 基于Appium的UI自动化测试
为什么需要UI自动化测试 移动端APP是一个复杂的系统,不同功能之间耦合性很强,很难仅通过单元测试保障整体功能.UI测试是移动应用开发中重要的一环,但是执行速度较慢,有很多重复工作量,为了减少这些工作 ...
- 《MySQL数据库》MySQL备份恢复
前言 MySQL数据库最重要的部分就是数据,所以保证数据不被损坏尤为重要,大家都知道911事件,当时非常多的数据丢失,导致经济混乱.接下来我们就来讲讲MySQL是如何保障数据完整,应对特殊情况,如何恢 ...
- 记录一次mybatis缓存和事务传播行为导致ut挂的排查过程
起因 rhea项目有两个ut一直都是挂的,之前也经过几个同事排查过,但是都没有找到解决办法,慢慢的这个问题就搁置了.因为之前负责rhea项目的同事离职,我临时接手了这个项目,刚好最近来了一个新同事在做 ...
- 【Docker】Docker安装运行dubbo-admin
运行dubbo-admin服务, 此服务需要单独启动一个zookeeper容器 dubbo-admin将监听所有注册到zookeeper的服务, dubbo-admin默认端口8080 1 运行一个z ...
- Volatile关键字&&DCL单例模式,volatile 和 synchronized 的区别
Volatile 英文翻译:易变的.可变的.不稳定的. 一.volatile 定义及用法 多个线程的工作内存彼此独立,互不可见,线程启动的时候,虚拟机为每个内存分配一块工作内存,不仅包含了线程内部定义 ...
- 有手就行 虚拟机上安装Linux
VMware上装Linux CentOS 初学一步步来
- 如何配置node环境变量
1,安装node.js 最后安装的目录在 检测node安装成功 node -v 如果报错 没有默认装在c盘 pro 需要配置环境变量 Npm node package manag ...
- WinMTR 网络测试工具-九五小庞
WinMTR(建议优先使用) 百度下载工具 链接:https://pan.baidu.com/s/19ArKSTA2amsa4p6vHegDIQ 提取码:cy4y WinMTR是mtr工具在Windo ...
- touchstart 事件与 click 事件的冲突
const clickEvent = (function() { if ('ontouchstart' in document.documentElement === true) retu ...
- 真正的解决IDEA中Tomcat控制台乱码的问题
真正的解决IDEA中Tomcat控制台乱码的问题 解决方案一 网上看到一个真正的解决方案: 首先要分清是tomcat日志编码,与idea的日志显示控制台编码 tomcat日志编码:当在cmd中启动To ...