HDU 6662 Acesrc and Travel 换根DP,宇宙最傻记录
#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,宇宙最傻记录的更多相关文章
- HDU 6662 Acesrc and Travel (换根dp)
Problem Description Acesrc is a famous tourist at Nanjing University second to none. During this sum ...
- Acesrc and Travel(2019年杭电多校第八场06+HDU6662+换根dp)
题目链接 传送门 题意 两个绝顶聪明的人在树上玩博弈,规则是轮流选择下一个要到达的点,每达到一个点时,先手和后手分别获得\(a_i,b_i\)(到达这个点时两个人都会获得)的权值,已经经过的点无法再次 ...
- [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]
题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...
- 2018.10.15 NOIP训练 水流成河(换根dp)
传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p ...
- 换根DP+树的直径【洛谷P3761】 [TJOI2017]城市
P3761 [TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公 ...
- 小奇的仓库:换根dp
一道很好的换根dp题.考场上现场yy十分愉快 给定树,求每个点的到其它所有点的距离异或上m之后的值,n=100000,m<=16 只能线性复杂度求解,m又小得奇怪.或者带一个log像kx一样打一 ...
- 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)
题意 题目链接:https://www.luogu.org/problem/P4827 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...
- bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp
题意:给定一颗树,树上每个点通电概率为 $q[i]$%,每条边通电的概率为 $p[i]$%,求期望充入电的点的个数. 期望在任何时候都具有线性性,所以可以分别求每个点通电的概率(这种情况下期望=概率 ...
- codeforces1156D 0-1-Tree 换根dp
题目传送门 题意: 给定一棵n个点的边权为0或1的树,一条合法的路径(x,y)(x≠y)满足,从x走到y,一旦经过边权为1的边,就不能再经过边权为0的边,求有多少边满足条件? 思路: 首先,这道题也可 ...
随机推荐
- 【CUDA 基础】3.2 理解线程束执行的本质(Part I)
title: [CUDA 基础]3.2 理解线程束执行的本质(Part I) categories: CUDA Freshman tags: 线程束分化 CUDA分支 toc: true date: ...
- [CSP-S模拟测试]:D(暴力+剪枝)
题目传送门(内部题47) 输入格式 第一行一个正整数$n$.第二行$n$个正整数,表示序列$A_i$. 输出格式 一行一个正整数,表示答案. 样例 样例输入: 530 60 20 20 20 样例输出 ...
- Mysql 修改密码和设置远程连接
[参考文章]:mysql修改root密码和设置权限 1. 修改密码 1.1 set password 登录mysql set password for 用户名@localhost = password ...
- idea如果发生@override is not allowed when implement 错误,可以在Project Structure-Modules中更改Language level,设置为6以上的。
- springboot 热部署替代方式
因为使用的 idea springboot2.2.0 snapshot版本, 常规的devtools方法实在是实现不了热部署,所以采用手动update的方法更新,测试可以成功更新resource里面的 ...
- Springdata-Jpa学习笔记
Respository接口 Respository是Springdata JPA中的顶层接口,提供了两种查询方法: 1)基于方法名称命名规则 2)基于@Qeury注解查询 1. 方法名称命名规则查询 ...
- LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)
题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1-& ...
- Nodepad++中将Tab键替换为空格
Nodepad++是一个非常优秀的文本编辑工具,本人经常使用其编辑shell脚本,如果不进行设置,Tab键和空格混用,脚本上传到linux后,格式错乱,不容易查看. 设置方式 菜单栏选择"设 ...
- php改变header头返回值
$code = '400 Bad Request'; header('HTTP/1.1 '.$code);
- kernel hacking的一些网站
很全面的网站,下面的网站基本都可以从该地址找到. 新手必备 subscrible/unsubscrible mail list mail list archive kernel git mainlin ...