【HDOJ6662】Acesrc and Travel(树形DP,换根)
题意:有一棵n个点的树,每个点上有两个值a[i],b[i]
A和B在树上行动,A到达i能得到a[i]的偷税值,B能得到b[i],每次行动只能选择相邻的点作为目标
两个人都想最大化自己的偷税值和对方的差,都按最优策略行动,不能走已经走过的点,行动直到没有点可走为止
A可以选择任意出发点,然后B开始走,然后A开始走……
n<=1e5,0<=a[i],b[i]<=1e9
思路:
f[u][0]表示从u出发下一步走儿子的min,f[u][1]表示max
g[u][0]表示从u出发下一步走父亲的min,g[u][1]表示max
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
//typedef pair<ll,ll>P;
#define N 1000010
#define M 200010
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const int MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
int INF=1e9;
int inf=0x7fffffff;
int dx[]={-,,,};
int dy[]={,,-,}; ll f[N][],g[N][];
ll t1[N],t2[N],t3[N],t4[N],t5[N],t6[N],a[N],b[N];
int head[N],vet[N],nxt[N],d[N],tot; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void add(int a,int b)
{
nxt[++tot]=head[a];
vet[tot]=b;
head[a]=tot;
} void dfs1(int u,int fa)
{
int e=head[u],s=;
ll t1=INF,t2=-INF;
while(e)
{
int v=vet[e];
if(v!=fa)
{
s++;
dfs1(v,u);
t1=min(t1,f[v][]);
t2=max(t2,f[v][]);
}
e=nxt[e];
}
if(s)
{
f[u][]=t1+a[u]-b[u];
f[u][]=t2+a[u]-b[u];
}
else f[u][]=f[u][]=a[u]-b[u];
} void dfs2(int u,int fa)
{
int s=;
int e=head[u];
while(e)
{
int v=vet[e];
if(v!=fa)
{
s++;
t1[s]=f[v][];
t2[s]=f[v][];
}
e=nxt[e];
}
t3[]=t1[];
rep(i,,s) t3[i]=max(t3[i-],t1[i]);
t4[s]=t1[s];
per(i,s-,) t4[i]=max(t4[i+],t1[i]);
t5[]=t2[];
rep(i,,s) t5[i]=min(t5[i-],t2[i]);
t6[s]=t2[s];
per(i,s-,) t6[i]=min(t6[i+],t2[i]);
e=head[u];
int i=;
while(e)
{
int v=vet[e];
if(v!=fa)
{
i++;
ll t=g[u][];
ll t0=-INF;
if(i->=) t0=max(t0,t3[i-]+a[u]-b[u]);
if(i+<=s) t0=max(t0,t4[i+]+a[u]-b[u]);
if(u==&&s>) t=t0;
else t=max(t,t0);
g[v][]=a[v]-b[v]+t;
t=g[u][];
t0=INF;
if(i->=) t0=min(t0,t5[i-]+a[u]-b[u]);
if(i+<=s) t0=min(t0,t6[i+]+a[u]-b[u]);
if(u==&&s>) t=t0;
else t=min(t,t0);
g[v][]=a[v]-b[v]+t;
}
e=nxt[e];
}
e=head[u];
while(e)
{
int v=vet[e];
if(v!=fa) dfs2(v,u);
e=nxt[e];
}
} int main()
{
//freopen("1.in","r",stdin);
int cas;
scanf("%d",&cas);
while(cas--)
{
int n=read();
rep(i,,n) a[i]=read();
rep(i,,n) b[i]=read();
rep(i,,n) head[i]=d[i]=;
tot=;
rep(i,,n-)
{
int x=read(),y=read();
add(x,y);
add(y,x);
d[x]++; d[y]++;
}
dfs1(,);
g[][]=g[][]=a[]-b[];
dfs2(,);
ll ans=-INF;
rep(i,,n)
{
if(i==) ans=max(ans,f[i][]);
else if(d[i]==) ans=max(ans,g[i][]);
else ans=max(ans,min(f[i][],g[i][]));
}
printf("%I64d\n",ans); } return ;
}
【HDOJ6662】Acesrc and Travel(树形DP,换根)的更多相关文章
- bzoj 3743 [Coci2015]Kamp——树形dp+换根
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那 ...
- 树形dp换根,求切断任意边形成的两个子树的直径——hdu6686
换根dp就是先任取一点为根,预处理出一些信息,然后在第二次dfs过程中进行状态的转移处理 本题难点在于任意割断一条边,求出剩下两棵子树的直径: 设割断的边为(u,v),设down[v]为以v为根的子树 ...
- poj3585 Accumulation Degree(树形dp,换根)
题意: 给你一棵n个顶点的树,有n-1条边,每一条边有一个容量z,表示x点到y点最多能通过z容量的水. 你可以任意选择一个点,然后从这个点倒水,然后水会经过一些边流到叶节点从而流出.问你最多你能倒多少 ...
- poj3585 Accumulation Degree[树形DP换根]
思路其实非常简单,借用一下最大流求法即可...默认以1为根时,$f[x]$表示以$x$为根的子树最大流.转移的话分两种情况,一种由叶子转移,一种由正常孩子转移,判断一下即可.换根的时候由頂向下递推转移 ...
- [题解](树形dp/换根)小x游世界树
2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当 ...
- 2019 Multi-University Training Contest 8 - 1006 - Acesrc and Travel - 树形dp
http://acm.hdu.edu.cn/showproblem.php?pid=6662 仿照 CC B - TREE 那道题的思路写的,差不多.也是要走路径. 像这两种必须走到叶子的路径感觉是必 ...
- 2019ICPC沈阳网络赛-D-Fish eating fruit(树上DP, 换根, 点分治)
链接: https://nanti.jisuanke.com/t/41403 题意: State Z is a underwater kingdom of the Atlantic Ocean. Th ...
- Acwing-287-积蓄程度(树上DP, 换根)
链接: https://www.acwing.com/problem/content/289/ 题意: 有一个树形的水系,由 N-1 条河道和 N 个交叉点组成. 我们可以把交叉点看作树中的节点,编号 ...
- 寒武纪-1005 Travel(树形DP)
一.题目链接 http://aiiage.hustoj.com/problem.php?id=1005 二.题面 PDF:http://aiiage.hustoj.com/upload/file/20 ...
- 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的距离 ...
随机推荐
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_5_BufferedWriter_字符缓冲输出流
使用newLine来换行 同样的效果 println的源码里面其实就用的就是newLine()
- 《计算机程式设计》Week4 课堂笔记
本笔记记录自 Coursera课程 <计算机程式设计> 台湾大学 刘邦锋老师 Week4 Functions 4-1 System Function 函数主要分为两大类系统定义函数与使用者 ...
- Navicat12安装与激活
安装Navicat 1.下载软件和激活工具 链接:https://pan.baidu.com/s/1pFo2BkZYPpPFldG-fhbzIA&shfl=sharepset 提取码:xs97 ...
- TensorFlow学习笔记6-数值计算基础
TensorFlow学习笔记6-数值计算 本笔记内容为"数值计算的基础知识".内容主要参考<Deep Learning>中文版. \(X\)表示训练集的矩阵,其大小为m ...
- 剑指offer--day10
1.1 题目:二叉搜索树的后序遍历序列:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 1.2 思路: 以{ ...
- idea奇葩问题汇总
1.用idea在tomcat里运行普通的springMVC项目,用nacos做为配置中心,通过@NacosValue来读取配置中心的值,配置了autoRefreshed = true但是不起作用,读取 ...
- MVC Html.AntiForgeryToken(); 防止跨站伪造请求(建议所有表单提交都加这个)
视图页面from表单中添加 @Html.AntiForgeryToken(); 然后每个表单提交的时候都会带__RequestVerificationToken 字段 后端控制器验证时添加 [Val ...
- c++中关于类的长度的猜想
在无意中,我偶然发现了类的长度并不是由函数的类型及个数决定,也并非是2的倍数.4的倍数. 在翻阅资料中,我得出了一些我认为可能的猜想. 我们先来看一串代码 #include<iostream&g ...
- levelDB SSTable-1
创建sstable文件 了解了sstable文件的存储格式,以及Data Block的组织,下面就可以分析如何创建sstable文件了.相关代码在table_builder.h/.cc以及block_ ...
- [Python3 填坑] 008 索引君的朋友 in
目录 1. print( 坑的信息 ) 2. 开始填坑 (1) 前情提要 (2) 索引君的朋友 in 上线 (3) 既然说了 in,不妨再说一说 not in (4) 一些补充 1. print( 坑 ...