#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=1e6+50;
const ll mod=1e9+7; int a[maxn],b[maxn];
vector<int>G[maxn];
ll dp[maxn][2]; /// 0 zhang 1 liu
ll hello[maxn][2];
ll hello2[maxn][2];
int who1[maxn][2];
int who2[maxn][2]; void go1(int u,int v){
who1[u][1]=who1[u][0];
who1[u][0]=v;
}
void go2(int u,int v){
who2[u][1]=who2[u][0];
who2[u][0]=v;
} ll flag[maxn];
int n;
void dfs1(int u,int f){
dp[u][0]=a[u]-b[u];
dp[u][1]=b[u]-a[u];
for(auto i:G[u]){
if(i==f)continue;
dfs1(i,u);
int v=i;
if(dp[v][0]>dp[who1[u][0]][0]){
go1(u,v);
}
else if(dp[v][0]>dp[who1[u][1]][0]){
who1[u][1]=v;
}
if(dp[v][1]>dp[who2[u][0]][1]){
go2(u,v);
}
else if(dp[v][1]>dp[who2[u][1]][1]){
who2[u][1]=v;
}
}
if(who1[u][0]!=0){
dp[u][0]-=dp[who2[u][0]][1];
dp[u][1]-=dp[who1[u][0]][0];
}
/*
cout<<"dp["<<u<<"]["<<0<<"]="<<dp[u][0]<<endl;
cout<<"dp["<<u<<"]["<<1<<"]="<<dp[u][1]<<endl;
for(int i=1;i<=2;i++){
for(int j=0;j<=1;j++){
if(i==1)cout<<"who1["<<u<<"]["<<j<<"]="<<who1[u][j]<<endl;
else cout<<"who2["<<u<<"]["<<j<<"]="<<who2[u][j]<<endl;
}
}
*/
}
ll sum[maxn];
int tmp1[maxn][2];
int tmp2[maxn][2];
int tmp3[maxn][2];
int tmp4[maxn][2];
ll aha1[maxn][2];
ll aha2[maxn][2]; void dfs2(int u,int f){
sum[u]=dp[u][0];
// cout<<"dp["<<u<<"]["<<0<<"]="<<dp[u][0]<<endl;
for(auto t:G[u]){
if(t==f)continue;
int v=t; for(int i=0;i<=1;i++){
aha1[u][i]=dp[u][i];
aha2[u][i]=dp[v][i];
} dp[u][0]+=dp[who2[u][0]][1];
dp[u][1]+=dp[who1[u][0]][0]; for(int j=0;j<=1;j++){
tmp1[u][j]=who1[u][j];
tmp2[u][j]=who2[u][j];
tmp3[u][j]=who1[v][j];
tmp4[u][j]=who2[v][j];
} if(who1[u][0]==v){
who1[u][0]=who1[u][1];
}
if(who2[u][0]==v){
who2[u][0]=who2[u][1];
}
if(who1[u][0]!=0){
dp[u][0]-=dp[who2[u][0]][1];
dp[u][1]-=dp[who1[u][0]][0];
} if(who1[v][0]!=0){
dp[v][0]+=dp[who2[v][0]][1];
dp[v][1]+=dp[who1[v][0]][0];
} if(dp[u][0]>dp[who1[v][0]][0]){
go1(v,u);
}
else if(dp[u][0]>dp[who1[v][1]][0]){
who1[v][1]=u;
}
if(dp[u][1]>dp[who2[v][0]][1]){
go2(v,u);
}
else if(dp[u][1]>dp[who2[v][1]][1]){
who2[v][1]=u;
} if(who1[v][0]!=0){
dp[v][0]-=dp[who2[v][0]][1];
dp[v][1]-=dp[who1[v][0]][0];
} // cout<<"dp["<<u<<"]["<<0<<"]="<<dp[u][0]<<endl;
// cout<<"dp["<<u<<"]["<<1<<"]="<<dp[u][1]<<endl;
/* for(int i=1;i<=2;i++){
for(int j=0;j<=1;j++){
if(i==1)cout<<"who1["<<u<<"]["<<j<<"]="<<who1[u][j]<<endl;
else cout<<"who2["<<u<<"]["<<j<<"]="<<who2[u][j]<<endl;
}
}*/ /* cout<<"***************"<<endl;
cout<<"dp["<<v<<"]["<<0<<"]="<<dp[v][0]<<endl;
cout<<"dp["<<v<<"]["<<1<<"]="<<dp[v][1]<<endl;*/
/*for(int i=1;i<=2;i++){
for(int j=0;j<=1;j++){
if(i==1)cout<<"who1["<<v<<"]["<<j<<"]="<<who1[v][j]<<endl;
else cout<<"who2["<<v<<"]["<<j<<"]="<<who2[v][j]<<endl;
}
} cout<<"nnnnnnnnnnnnnnn"<<endl;*/
dfs2(v,u); dp[v][0]+=dp[who2[v][0]][1];
dp[v][1]+=dp[who1[v][0]][0]; for(int j=0;j<=1;j++){
who1[u][j]=tmp1[u][j];
who2[u][j]=tmp2[u][j];
who1[v][j]=tmp3[u][j];
who2[v][j]=tmp4[u][j];
}
if(who1[v][0]!=0){
dp[v][0]-=dp[who2[v][0]][1];
dp[v][1]-=dp[who1[v][0]][0];
}
dp[u][0]-=dp[who2[u][0]][1];
dp[u][1]-=dp[who1[u][0]][0];
/*
for(int j=1;j<=2;j++){
for(int k=0;k<=1;k++){
if(j==1){
cout<<"who1["<<u<<"]["<<k<<"]="<<who1[u][k]<<endl;
}
else{
cout<<"who1["<<u<<"]["<<k<<"]="<<who2[u][k]<<endl;
}
}
}*/
for(int i=0;i<=1;i++){
dp[u][i]=aha1[u][i];
dp[v][i]=aha2[u][i];
}
}
} int main(){
std::ios::sync_with_stdio(false);
int t;
cin>>t;
dp[0][0]=-1e18;
dp[0][1]=-1e18;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
G[i].clear();
dp[i][0]=dp[i][1]=0;
sum[i]=0;
hello[i][0]=hello[i][1]=0;
who1[i][0]=who1[i][1]=0;
who2[i][0]=who2[i][1]=0;
}
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
} dfs1(1,0);
// cout<<"**************"<<endl;
dfs2(1,0);
ll ans=0;
ll mx=-1e18;
for(int i=1;i<=n;i++){
mx=max(sum[i],mx);
}
cout<<mx<<endl;
}
return 0;
}
/*
5
5
1 2 4 100 1000
5 3 7 0 0
1 2
1 3
3 4
3 5 */

HDU 6662 Acesrc and Travel 换根DP,宇宙最傻记录的更多相关文章

  1. HDU 6662 Acesrc and Travel (换根dp)

    Problem Description Acesrc is a famous tourist at Nanjing University second to none. During this sum ...

  2. Acesrc and Travel(2019年杭电多校第八场06+HDU6662+换根dp)

    题目链接 传送门 题意 两个绝顶聪明的人在树上玩博弈,规则是轮流选择下一个要到达的点,每达到一个点时,先手和后手分别获得\(a_i,b_i\)(到达这个点时两个人都会获得)的权值,已经经过的点无法再次 ...

  3. [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]

    题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...

  4. 2018.10.15 NOIP训练 水流成河(换根dp)

    传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p ...

  5. 换根DP+树的直径【洛谷P3761】 [TJOI2017]城市

    P3761 [TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公 ...

  6. 小奇的仓库:换根dp

    一道很好的换根dp题.考场上现场yy十分愉快 给定树,求每个点的到其它所有点的距离异或上m之后的值,n=100000,m<=16 只能线性复杂度求解,m又小得奇怪.或者带一个log像kx一样打一 ...

  7. 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4827 ​ 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...

  8. bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp

    题意:给定一颗树,树上每个点通电概率为 $q[i]$%,每条边通电的概率为 $p[i]$%,求期望充入电的点的个数. 期望在任何时候都具有线性性,所以可以分别求每个点通电的概率(这种情况下期望=概率 ...

  9. codeforces1156D 0-1-Tree 换根dp

    题目传送门 题意: 给定一棵n个点的边权为0或1的树,一条合法的路径(x,y)(x≠y)满足,从x走到y,一旦经过边权为1的边,就不能再经过边权为0的边,求有多少边满足条件? 思路: 首先,这道题也可 ...

随机推荐

  1. ValseWebninar 报告汇总

    ValseWebninar为计算机视觉.图像处理.模式识别与机器学习等研究领域内的华人青年学者提供深入学术交流的舞台. 20191218:基于视觉和常识的深度推理  主持人:    主讲人: 2019 ...

  2. js基础----数组

    1.数组如何定义 //第一种定义方法 var arr=[1,2,3,4]; //第二种定义方法 var arr=new Array(1,2,3,4); 两者没有任何区别,[]的性能可能略高,因为代码短 ...

  3. html基础(img、a、列表 )

    图片标签(img) <img src="图片路径" alt="图片描述 图片无法正常显示出现文字" title="爱你"/> i ...

  4. Hive使用与安装步骤

    1.Hive安装与配置 Hive官网:https://hive.apache.org/ 1. 安装文件下载 从Apache官网下载安装文件 http://mirror.bit.edu.cn/apach ...

  5. Android学习_Selector

    Selector 实现组件在不同状态下不同的文字颜色.背景颜色或图片的切换,使用十分方便. 1. 创建方法 第一种:在XML中直接创建selector的XML文件,容易掌握,简单但是不灵活,较为常用. ...

  6. Yum:[Errno 5] [Errno 2] No such file or directory

    出现这样的问题,就是因为之前python2升级到python3之后,yum有些配置文件定位不到之前的python2了,所以这里需要改掉两个配置文件就不会出事了. yum安装软件时,可以连接yum 仓库 ...

  7. postgres的数据库备份和恢复

    备份和恢复 一条命令就可以解决很简单: 这是备份的命令: pg_dump -h 127/0.0.1 -U postgres databasename > databasename.bak 指令解 ...

  8. 搞清楚MySQL事务隔离级别

    首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 然后往表中插入两条数据,插入后结果如下: 为了说明问题 ...

  9. linux mmap 内存映射

    mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间), ...

  10. JAVA向C传递数据

    传递数组 数组是个对象,传递对象就是传递地址,修改地址上的值,数组的内容就会改变 //获取数组首地址 int* p = (*env)->GetIntArrayElements(env, arra ...