题目大意:给你一棵树,每个节点有一个权值,Alice和Bob进行博弈,起点由Alice确定,确定后交替选择下一个点,Alice目标是最终值尽可能大,Bob目标是尽可能小

题解:很明显是树形DP,那么考虑如何dp

设F[i][0/1]表示第i个点先手选/后手选的答案

那么不难想到

F[i][0]=max(F[j][1])+v[i]

F[i][1]=min(F[j][0])+v[i]

一次以1为根进行dfs可以求出选择1为根时的答案,此时考虑换根

换根时将换根前的所有状态保存下来,dfs下去之后求出其子树答案后将状态复原

换根时有两种情况,1、原根的答案是新根推过来的。2、原根的答案不是从新根推过来的

对于第二种情况很简单,我们只需要把原根当做新根的子树然后进行转移即可

考虑第一种情况,将原根变为儿子之后,其F值由除新根之外的所有儿子转移而来

于是很容易想到在原有保存最大值(最小值)的基础上再保存次大值(次小值),这样就可以O(1)更新原根的答案了

更新完后就和第二种情况一样了

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#define ll long long
#define INF 1e18
using namespace std;
int T,n;
ll v[],f[][];
ll mx[][],mn[][];
ll ans;
int mxbh[],mnbh[];
struct node
{
int x,y;
}tr[*];
int hd[],nxt[*],rn;
void build(int x,int y){tr[++rn]=(node){x,y};nxt[rn]=hd[x];hd[x]=rn;}
void init()
{
rn=;
memset(f,,sizeof(f));
memset(hd,,sizeof(hd));
memset(nxt,,sizeof(nxt));
}
void dfs(int now,int last)
{
int t1=hd[now],t2;
mx[now][]=mx[now][]=-INF;
mn[now][]=mn[now][]=INF;
mxbh[now]=;mnbh[now]=;
while(t1)
{
t2=tr[t1].y;
if(t2!=last)
{
dfs(t2,now);
if(f[t2][]>=mx[now][]){mx[now][]=mx[now][];mx[now][]=f[t2][];mxbh[now]=t2;}
else if(f[t2][]>mx[now][])mx[now][]=f[t2][];
if(f[t2][]<=mn[now][]){mn[now][]=mn[now][];mn[now][]=f[t2][];mnbh[now]=t2;}
else if(f[t2][]<mn[now][])mn[now][]=f[t2][];
}
t1=nxt[t1];
}
if(mx[now][]==-INF)mx[now][]=;
if(mn[now][]==INF)mn[now][]=;
//printf("%d:%lld %lld %lld\n",now,mx[now][0],mn[now][0],v[now]);
f[now][]=mx[now][]+v[now];
f[now][]=mn[now][]+v[now];
//printf("%d %lld %lld %lld\n",now,f[now][1],max1,v[now]);
}
void dfs2(int now,int last)
{
ans=max(ans,f[now][]);
//printf(" %d\n",now);
//for(int i=1;i<=n;i++)printf("%lld %lld:%d %d\n",f[i][0],f[i][1],mxbh[i],mnbh[i]);
//printf(" %lld %lld|%lld %lld\n",mx[now][0],mx[now][1],mn[now][0],mn[now][1]);
//printf("\n");
int t1=hd[now],t2;
ll fi0,fi1,fj0,fj1,tv,mxj0,mxj1,mnj0,mnj1;
int mxbhi,mxbhj,mnbhi,mnbhj;
while(t1)
{
t2=tr[t1].y;
if(t2!=last)
{
fi0=f[now][];fi1=f[now][];
fj0=f[t2][];fj1=f[t2][];
mxbhi=mxbh[now];mnbhi=mnbh[now];
mxbhj=mxbh[t2];mnbhj=mnbh[t2];
if(mxbh[now]==t2)
{
tv=v[now];
if(mx[now][]!=-INF)tv+=mx[now][];
f[now][]=tv;
}
if(mnbh[now]==t2)
{
tv=v[now];
if(mn[now][]!=INF)tv+=mn[now][];
f[now][]=tv;
}
mxj0=mx[t2][];mxj1=mx[t2][];
mnj0=mn[t2][];mnj1=mn[t2][];
if(mxbhj==)mx[t2][]=-INF;
if(mnbhj==)mn[t2][]=INF;
if(f[now][]>=mx[t2][]){mx[t2][]=mx[t2][];mx[t2][]=f[now][];mxbh[t2]=now;}
else if(f[now][]>mx[t2][])mx[t2][]=f[now][];
if(f[now][]<=mn[t2][]){mn[t2][]=mn[t2][];mn[t2][]=f[now][];mnbh[t2]=now;}
else if(f[now][]<mn[t2][])mn[t2][]=f[now][];
f[t2][]=mx[t2][]+v[t2];
f[t2][]=mn[t2][]+v[t2];
dfs2(t2,now);
f[now][]=fi0;f[now][]=fi1;
f[t2][]=fj0;f[t2][]=fj1;
mx[t2][]=mxj0;mx[t2][]=mxj1;
mn[t2][]=mnj0;mn[t2][]=mnj1;
mxbh[now]=mxbhi;mnbh[now]=mnbhi;
mxbh[t2]=mxbhj;mnbh[t2]=mnbhj;
}
t1=nxt[t1];
}
}
int main()
{
scanf("%d",&T);
int a,b;
while(T--)
{
init();
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lld",&v[i]);
for(int i=;i<=n;i++){scanf("%d",&a);v[i]-=a;}
for(int i=;i<n;i++)
{
scanf("%d%d",&a,&b);
build(a,b);build(b,a);
}
memset(f,,sizeof(f));
dfs(,);
ans=-INF;
//for(int i=1;i<=n;i++)printf("%lld %lld/%lld %lld:%d %d %lld %lld\n",mx[i][0],mx[i][1],mn[i][0],mn[i][1],mxbh[i],mnbh[i],f[i][0],f[i][1]);
dfs2(,);
//ans=-INF;
//for(int i=1;i<=n;i++)ans=max(ans,f[i][1]);
//for(int i=1;i<=n;i++)printf("%lld %lld:%d %d\n",f[i][0],f[i][1],mxbh[i],mnbh[i]);
printf("%lld\n",ans);
}
return ;
}

心得:典型的树形DP的题目,换根时的操作还需要更多练习熟练

【HDU6662】Acesrc and Travel【树形DP】的更多相关文章

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

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

  2. 2019杭电多校 hdu6662 Acesrc and Travel (树形dp

    http://acm.hdu.edu.cn/showproblem.php?pid=6662 题意:有两个人在树上博弈,每个点节点有两个分数a[i]和b[i],先手先选择一个点,后手在先手选的点的相邻 ...

  3. BZOJ.1576.[Usaco2009 Jan]安全路经Travel(树形DP 并查集)

    题目链接 BZOJ 洛谷 先求最短路树.考虑每一条非树边(u,v,len),设w=LCA(u,v),这条边会对w->v上的点x(x!=w)有dis[u]+dis[v]-dis[x]+len的距离 ...

  4. 寒武纪-1005 Travel(树形DP)

    一.题目链接 http://aiiage.hustoj.com/problem.php?id=1005 二.题面 PDF:http://aiiage.hustoj.com/upload/file/20 ...

  5. 【HDU6662】Acesrc and Travel(树型Dp)

    题目链接 大意 给出一颗树,每个点上有一个权值\(A[i]\),有两个绝顶聪明的人甲和乙. 甲乙两人一起在树上轮流走,不能走之前经过的点.(甲乙时刻在一起) 甲先手,并可以确定起点.甲想要走过的点权之 ...

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

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

  7. hdu 4612 Warm up 双连通+树形dp思想

    Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total S ...

  8. HDU 6201 transaction transaction transaction(树形DP)

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  9. HDU - 3899 JLUCPC(树形dp求距离和)

    JLUCPC Dr. Skywind and Dr. Walkoncloud are planning to hold the annual JLU Collegiate Programming Co ...

随机推荐

  1. .NETFramework:System.Collections.Generic.KeyValuePair.cs

    ylbtech-.NETFramework:System.Collections.Generic.KeyValuePair.cs 定义可设置或检索的键/值对 1.返回顶部 1. #region 程序集 ...

  2. STM32之光敏电阻传感器模块的使用

    本实验配合2.2寸TFT液晶屏显示,当光弱的时候显示“昏暗”,光强时显示“明亮”. 实验使用的是下图所示的3线光敏电阻传感器模块,用途:光线亮度检测,光线亮度传感器,智能小车寻光模块.模块特色:比较器 ...

  3. Oracle创建dblink进行跨数据库操作

    创建dblink:create public database link link_to_test connect to 用户名 IDENTIFIED by "密码大写" usin ...

  4. 关于Vue+iview的简单下拉框滚动加载

    话不多说,直接上代码,作用是下拉框内容无限滚动加载: Html: <FormItem style="position:relative" label="用户名:&q ...

  5. 03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上)

    上一节,我给你讲了要怎么理解平均负载( Load Average),并用三个案例展示了不同场景下平均负载升高的分析方法.这其中,多个进程竞争 CPU 就是一个经常被我们忽视的问题. 我想你一定很好奇, ...

  6. shtml与html

    前言 在浏览网页的时,忽然发现了一个网址不是以[.html]结尾,而是[.shtml].顿时勾起了我的好奇心,这是什么鬼?于是打开google,开始维基. SHTML 什么是 SHTML 使用SSI( ...

  7. 读取交货单拣配数量PIKMG(转)

    原文链接:https://www.591sap.com/thread-953-1-1.html SAP交货单交货数量在lips中直接读取,但是拣配数量lfimg,只存在vbfa中,且如果基本计量单位和 ...

  8. Spring学习(三)--高级装配

    一.Spring profile 在开发软件的时候,有一个很大的挑战就是将应用程序从一个环境迁 移到另外一个环境.开发阶段中,某些环境相关做法可能并不适合迁 移到生产环境中,甚至即便迁移过去也无法正常 ...

  9. CSRF——跨站请求伪造

    一.CSRF是什么CSRF,全称:Corss-site request forgery,中文名称:跨站请求伪造.CSRF攻击比XSS攻击更具危险性,被安全界称为“沉睡的巨人”. 二.CSRF可以做什么 ...

  10. 2018-2-13-win10-UWP-RSS阅读器

    title author date CreateTime categories win10 UWP RSS阅读器 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 1 ...