http://acm.hdu.edu.cn/showproblem.php?pid=6662

题意:有两个人在树上博弈,每个点节点有两个分数a[i]和b[i],先手先选择一个点,后手在先手选的点的相邻点中选择一个点,然后先手在后手选的点的相邻点中选择一个两个人都没有走过的点,直到不能走,游戏就结束。一个人走到节点x,那么先手会获得分数a[x],后手就会会获得分数b[x]。最后询问先手能获得与后手的差值最大值。

思路:先手固定好位置后,后手走。有两种走法,向下和向上。

向下好办,用down[i][0]表示我从i走到i的儿子后所能得到的最大值,down[i][1]为对手走的最小值,那么down[i][0] = v[i]+max(down[son][1]), down[i][1]=v[i]+min(down[son][0])

向上的话,走完后对面也分为向上或向下。

向下走时,不能走当前上去的路,所以存每个点向下走的最值和次值,当最值和上去那条路得出的值相同,就换成次值。

向上走时,从上到下一路维护即可。

 #include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn = 1e5+;
const ll inf = 0x3f3f3f3f3f3f3f3f;
ll a[maxn],b[maxn];
int head[maxn],fa[maxn],to[maxn<<],nex[maxn<<],now; void add(int a,int b){
nex[++now] = head[a];
head[a] = now;
to[now] = b;
} ll down[maxn][][],up[maxn][];
bool lef[maxn]; void dfs(int p){
down[p][][] = down[p][][] = -inf;
down[p][][] = down[p][][] = inf;
lef[p] = ;
for(int i=head[p];i;i=nex[i]){
if(to[i]==fa[p]) continue;
lef[p] = ;
fa[to[i]] = p;
dfs(to[i]);
if(down[to[i]][][]+a[p]>=down[p][][]){
down[p][][] = down[p][][];
down[p][][] = down[to[i]][][]+a[p];
}
else if(down[to[i]][][]+a[p]>=down[p][][]){
down[p][][] = down[to[i]][][]+a[p];
}
if(down[to[i]][][]+a[p]<=down[p][][]){
down[p][][] = down[p][][];
down[p][][] = down[to[i]][][]+a[p];
}
else if(down[to[i]][][]+a[p]<=down[p][][]){
down[p][][] = down[to[i]][][]+a[p];
}
}
if(lef[p]) down[p][][] = down[p][][] = a[p];
} ll Abs(ll a){
return a>?a:-a;
} void Dfs(int p){
if(fa[p]==-) up[p][] = up[p][] = inf;
else {
up[p][] = inf;
ll _down = down[fa[p]][][];
if(_down==a[fa[p]]+down[p][][])
_down = down[fa[p]][][];
if(Abs(_down)!=inf)
up[p][] = min(up[p][],a[p]+_down);
if(fa[p]!=)
up[p][] = min(up[p][],a[p]+up[fa[p]][]);
if(up[p][]==inf)
up[p][] = a[p]+a[fa[p]]; up[p][] = -inf;
_down = down[fa[p]][][];
if(_down==a[fa[p]]+down[p][][])
_down=down[fa[p]][][];
if(Abs(_down)!=inf)
up[p][]=max(up[p][],a[p]+_down); if(fa[p]!=)
up[p][]=max(up[p][],a[p]+up[fa[p]][]); if(up[p][]==-inf)
up[p][]=a[p]+a[fa[p]];
}
for(int i=head[p];i;i=nex[i]){
if(to[i]==fa[p])continue;
Dfs(to[i]);
}
} int main(){
ios::sync_with_stdio();
cin.tie();
cout.tie();
int t;
cin>>t;
while(t--){
memset(head,,sizeof head);
now = ;
int n;
cin>>n;
rep(i,,n) cin>>a[i];
rep(i,,n) cin>>b[i], a[i]-=b[i];
rep(i,,n-){
int u,v;
cin>>u>>v;
add(u,v);
add(v,u);
}
if(n==){
cout<<a[]<<endl;
continue;
}
fa[] = -;
dfs();
Dfs();
ll ans = -inf;
for(int i=;i<=n;i++){
ll res = inf;
if(!lef[i]) res = min(res,down[i][][]);
if(i!=) res = min(res,up[i][]);
ans = max(ans,res);
}
cout<<ans<<endl;
}
return ;
}

2019杭电多校 hdu6662 Acesrc and Travel (树形dp的更多相关文章

  1. 2019杭电多校 hdu6659 Acesrc and Good Numbers

    http://acm.hdu.edu.cn/showproblem.php?pid=6659 题意:给你d,x,让求满足f(d,n)=n的最大n(n<=x),其中f(d,n)表示数字d在从1到n ...

  2. 2019 Multi-University Training Contest 8 - 1006 - Acesrc and Travel - 树形dp

    http://acm.hdu.edu.cn/showproblem.php?pid=6662 仿照 CC B - TREE 那道题的思路写的,差不多.也是要走路径. 像这两种必须走到叶子的路径感觉是必 ...

  3. 2019杭电多校&CCPC网络赛&大一总结

    多校结束了, 网络赛结束了.发现自己还是太菜了,多校基本就是爆零和签到徘徊,第一次打这种高强度的比赛, 全英文,知识点又很广,充分暴露了自己菜的事实,发现数学还是很重要的.还是要多刷题,少玩游戏. 网 ...

  4. 2019杭电多校第一场hdu6581 Vacation

    Vacation 题目传送门 update(O(n)) 看了那个O(n)的方法,感觉自己想的那个O(nlogn)的好傻,awsl. 0车最终通过停车线的时候,状态一定是某个车堵住后面的所有车(这个车也 ...

  5. 2019杭电多校第二场hdu6601 Keen On Everything But Triangle

    Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...

  6. 2019杭电多校第二场hdu6602 Longest Subarray(线段树)

    Longest Subarray 题目传送门 解题思路 本题求一个最大的子区间,满足区间内的数字要么出现次数大于等于k次,要么没出现过.给定区间内的数字范围是1~c. 如果r为右边界,对于一种数字x, ...

  7. Rikka with Game[技巧]----2019 杭电多校第九场:1005

      Rikka with Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Othe ...

  8. 2019杭电多校6 hdu6638 Snowy Smile(二维最大矩阵和 线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6638 题意:给你一些点的权值,让找一个矩形圈住一部分点,问圈住点的最大权值和 分析:由于是稀疏图,明显要先把x, ...

  9. 2019杭电多校三 C. Yukikaze and Demons (点分治)

    大意: 给定树, 每个点有一个十进制数位, 求有多少条路径组成的十进制数被$k$整除. 点分治, 可以参考CF715C, 转化为求$10^a x+b\equiv 0(mod\space k)$的$x$ ...

随机推荐

  1. 泥瓦匠 5 年 Java 的成长感悟(下)

    继续<泥瓦匠 5 年 Java 的成长感悟(上)>,大致包括下面几点: 学技术的心态 学技术的学法 工作的心态 工作的硬技能 工作的软实力 听点雷子的民谣,我就安静地感概感概.上次说写的, ...

  2. 七分钟理解什么是 KMP 算法

    本文是介绍 什么是 BF算法.KMP算法.BM算法 三部曲之一. KMP算法 内部涉及到的数学原理与知识太多,本文只会对 KMP算法 的运行过程. 部分匹配表 .next数组 进行介绍,如果理解了这三 ...

  3. A solution to the never shortened to-do list

    I once told my younger sister my learning system, and the basic five doctrines of my methodology. Bu ...

  4. 【Kubernetes 系列四】Kubernetes 实战:管理 Hello World 集群

    目录 1. 创建集群 1.1. 安装 kubectl 1.1.1. 安装 kubectl 到 Linux 1.1.2. 安装 kubectl 到 macOS 1.1.3. 安装 kubectl 到 W ...

  5. Spring Boot 支持 Https 有那么难吗?

    https 现在已经越来越普及了,特别是做一些小程序或者公众号开发的时候,https 基本上都是刚需了. 不过一个 https 证书还是挺费钱的,个人开发者可以在各个云服务提供商那里申请一个免费的证书 ...

  6. DMP大数据营销

    一.下载大数据营销APP 使用手机浏览器扫描二维码 二.使用大数据营销APP 1.打开app,如果手机没有打开蓝牙和GPS定位app会自动提示让您打开,若app没有提示请手动去打开蓝牙和GPS 2.搜 ...

  7. 如何删除GIT仓库中的敏感信息

    如何删除GIT仓库中的敏感信息 正常Git仓库中应该尽量不包含数据库连接/AWS帐号/巨大二进制文件,否则一旦泄漏到Github,这些非常敏感信息会影响客户的信息安全已经公司的信誉.公司可能其它还有相 ...

  8. ZooKeeper系列(三)—— Zookeeper 常用 Shell 命令

    一.节点增删改查 1.1 启动服务和连接服务 # 启动服务 bin/zkServer.sh start #连接服务 不指定服务地址则默认连接到localhost:2181 zkCli.sh -serv ...

  9. 记录一次基于docker搭建jira平台

    背景:项目需要选择不同测试平台,筛选一个最佳平台 现状:一台机器安装多套环境,虚拟机太繁琐 解决方案:通过Docker模拟安装测环境 1.pull docker 镜像: jira:7.11.1(目前的 ...

  10. 【数据结构】8.java源码关于HashMap

    1.hashmap的底层数据结构 众所皆知map的底层结构是类似邻接表的结构,但是进入1.8之后,链表模式再一定情况下又会转换为红黑树在JDK8中,当链表长度达到8,并且hash桶容量超过64(MIN ...