【HDU - 6662】Acesrc and Travel(树形dp,博弈dp)

题干:

Acesrc is a famous tourist at Nanjing University second to none. During this summer holiday, he, along with Zhang and Liu, is going to travel to Hong Kong. There are nnspots in Hong Kong, and n−1n−1 bidirectional sightseeing bus routes connecting these spots. They decide to visit some spots by bus. 

However, Zhang and Liu have different preferences for these spots. They respectively set a satisfactory value for each spot. If they visit the iith spot, Zhang will obtain satisfactory value aiai, and Liu will obtain bibi. Starting with Zhang, they alternately decide the next spot to visit for the sake of fairness. There must be a bus route between the current spot and the next spot to visit. Moreover, they would never like to visit a spot twice. If anyone can't find such a next spot to visit, they have no choice but to end this travel. 

Zhang and Liu are both super smart competitive programmers. Either want to maximize the difference between his total satisfactory value and the other's. Now Acesrc wonders, if they both choose optimally, what is the difference between total satisfactory values of Zhang and Liu?

Input

The first line of input consists of a single integer TT (1≤T≤30)(1≤T≤30), denoting the number of test cases. 

For each test case, the first line contains a single integer nn (1≤n≤105)(1≤n≤105), denoting the number of spots. Each of the next two lines contains nn integers, a1,a2,⋯,ana1,a2,⋯,an and b1,b2,⋯,bnb1,b2,⋯,bn (0≤ai,bi≤109)(0≤ai,bi≤109), denoting the 
satisfactory value of Zhang and Liu for every spot, respectively. Each of the last n−1n−1 lines contains two integers x,yx,y (1≤x,y≤n,x≠y)(1≤x,y≤n,x≠y), denoting a bus route between the xxth spot and the yyth spot. It is reachable from any spot to any other spot through these bus routes. 

It is guaranteed that the sum of nn does not exceed 5.01×1055.01×105.

Output

For each test case, print a single integer in one line, the difference of total satisfactory values if they both choose optimally.

Sample Input

1
3
1 1 1
0 2 3
1 2
1 3

Sample Output

-1

题目大意:

n个点的一棵无根无向树,每个点代表一个景点,有A和B两个人,A先手。每个人轮流选择下一个景点去哪里(选择的景点必须和当前景点有连边),走到第i个景点的时候,A会获得ai点满意度,B会获得bi点满意度,每个景点只能走一次,当走到无法再走的时候,游戏结束。现在已知A和B都以最佳策略选取景点,最佳策略指的是自己的总满意度和对方的总满意度的差值最大。求这个最大差值。

解题报告:

首先简化一下题意,可以构造c[i]=a[i]-b[i],那么两人的总满意度的差值记为sum=\sum c[i],所以也就是A想让sum最大,B想让sum最小。然后考虑树形dp。

第一遍dfs处理出以每个点u为起点,只能往孩子节点v[i]走的最大值和最小值。

第二遍dfs处理出每个点u为起点,往父亲节点走的最大值和最小值。这一点可以用set做到。

对于第二遍dfs具体实现的时候就是对于每一个e=(u,v),先处理出一个数组g[v][2]代表以他为起点,向原父节点走,最大值和最小值,然后再去dfs(v,cur)这样。

比赛的时候两个细节没写好、、、主要还是dp状态写的时候和转移的时候有点乱了,导致有一点逻辑错误

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 1e5+5;
const ll INF = 1e18;
ll dp[MAX][2];//dp[i][0] Zhang   dp[i][1]  Liu					//dp[i][0] max{a[i]-b[i]}   dp[i][1]  min{a[i]-b[i]}
ll g[MAX][2];
ll a[MAX],b[MAX]; 
multiset<ll> s0[MAX],s1[MAX];
struct Edge {int v,ne;
} e[MAX<<1];
int head[MAX],tot;
int n;
void add(int u,int v) {e[++tot].v = v;e[tot].ne = head[u]; head[u] = tot;
}
void dfs(int cur,int fa) {int yz = 1;for(int i = head[cur]; ~i; i = e[i].ne) {int v = e[i].v;if(v == fa) continue;yz=0;dfs(v,cur);}if(yz == 1) {
//		s0[cur].insert(a[cur]-b[cur]);s1[cur].insert(a[cur]-b[cur]);dp[cur][1]=dp[cur][0] = a[cur]-b[cur];return;}for(int i = head[cur]; ~i; i = e[i].ne) {int v = e[i].v;if(v == fa) continue;dp[cur][0] = max(dp[cur][0],dp[v][1]+a[cur]-b[cur]);//Zhang 决策 =  dp[cur][1] = min(dp[cur][1],dp[v][0]+a[cur]-b[cur]);s0[cur].insert(dp[v][1]+a[cur]-b[cur]);s1[cur].insert(dp[v][0]+a[cur]-b[cur]);}
}
void dfs2(int cur,int fa) {ll qq0,qq1;if(fa!=0) s0[cur].insert(g[cur][0]),s1[cur].insert(g[cur][1]);for(int i = head[cur]; ~i; i = e[i].ne) {int v = e[i].v;if(v == fa) continue;auto it0 = s0[cur].find(dp[v][1]+a[cur]-b[cur]);ll tmp0 = *it0;s0[cur].erase(it0);auto it1 = s1[cur].find(dp[v][0]+a[cur]-b[cur]);ll tmp1 = *it1;s1[cur].erase(it1);if(s0[cur].empty()) g[v][0]=g[v][1]=a[cur]-b[cur]+a[v]-b[v];//s0[v].insert(a[v] - b[v]),s1[v].insert(a[v]-b[v]);else {qq0 = (*s0[cur].rbegin()),qq1 = (*s1[cur].begin());
//			if(fa != 0) {
//				g[v][0] = min(g[cur][1]+a[v]-b[v],(qq1) + a[v] - b[v]);
//				g[v][1] = max(g[cur][0]+a[v]-b[v],(qq0) + a[v] - b[v]);
//			}
//			else {g[v][0] = qq1 + a[v] - b[v];g[v][1] = qq0 + a[v] - b[v];				
//			}}s0[cur].insert(tmp0);s1[cur].insert(tmp1);dfs2(v,cur);}}
int main()
{int t;cin>>t;while(t--) {scanf("%d",&n);tot=0;for(int i = 1; i<=n; i++) head[i] = -1,s0[i].clear(),s1[i].clear();for(int i = 1; i<=n; i++) scanf("%lld",a+i),dp[i][0]=-INF,dp[i][1]=INF;for(int i = 1; i<=n; i++) scanf("%lld",b+i);for(int u,v,i = 1; i<n; i++) scanf("%d%d",&u,&v),add(u,v),add(v,u);dfs(1,0);//g[1][0]=g[1][1]=a[1]-b[1];dfs2(1,0);ll ans = -INF;for(int i = 1; i<=n; i++) {
//			printf("***%d %lld\n",i,*s1[i].begin());ans = max(*s1[i].begin(),ans);}printf("%lld\n",ans);} return 0 ;
}
/*
1000
错误样例
8
1 4 2 0 4 1 0 3
4 0 0 1 0 4 4 4
6 5
5 1
6 4
2 4
7 5
3 5
3 8
错误样例 
7
2 3 4 5 5 5 5
2 2 1 13 8 3 3
1 2
1 3
3 4
3 5
5 6
5 7
错误样例 
6
1 3 3 4 2 4
5 7 2 1 1 3
1 2
1 3
1 4
1 5
1 6
*/

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一步步编写操作系统 69 汇编语言和c语言共同协作 70

由于有了上一节的铺垫&#xff0c;本节的内容相对较少&#xff0c;这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用。 会两种不同语言的人&#xff0c;只是掌握了同一件事物的两种表达方式。人在学习一种新语言时&#xff0c;潜意识里是建立了语言符号与事物形象…

一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

一直以来&#xff0c;我们在往屏幕上输出文本时&#xff0c;要么利用bios中断&#xff0c;要么利用系统调用&#xff0c;这些都是依赖别人的方法。咱们还用过一个稍微有点独立的方法&#xff0c;就是直接写显存&#xff0c;但这貌似又没什么含量。如今我们要写一个打印函数了&a…

【CodeForces - 208C 】Police Station(单源最短路条数,起点终点建图,枚举顶点)

题干&#xff1a; The Berland road network consists of n cities and of m bidirectional roads. The cities are numbered from 1 to n, where the main capital city has number n, and the culture capital — number 1. The road network is set up so that it is possi…

【Chrome浏览器】常用快捷键整理

标签页和窗口快捷键 1. Ctrl n 打开新窗口 2. Ctrl t 打开新的标签页&#xff0c;并跳转到该标签页 3. Ctrl Shift t 重新打开最后关闭的标签页&#xff0c;并跳转到该标签页 4. Ctrl Tab 跳转到下一个打开的标签页 5. Ctrl Shift Tab 跳转到上一个打开的标签页 6.…

【人工智能课程实验】 - 利用贝叶斯分类器实现手写数字 的识别

读入数据与预处理 因为老师给的文件无法直接读取&#xff0c;故从官网导入数据&#xff1a; 官网链接&#xff1a;http://www.cs.nyu.edu/~roweis/data.html 导入数据之后要对MATLAB文件进行读入&#xff1a; datasio.loadmat(trainfile) 对文件type一下&#xff1a; ty…

一步步编写操作系统 77 内联汇编与ATT语法简介

内联汇编 之前和大家介绍过了一种汇编方法&#xff0c;就是C代码和汇编代码分别编译&#xff0c;最后通过链接的方式结合在一起形成可执行文件。 另一种方式就是在C代码中直接嵌入汇编语言&#xff0c;强大的GCC无所不能&#xff0c;咱们本节要学习的就是这一种&#xff0c;它…

【Python学习】内置函数(不断更新)

关于常用在for循环中的range函数 python range() 函数可创建一个整数列表&#xff0c;一般用在 for 循环中。 函数语法 range(start, stop[, step]) 参数说明&#xff1a; start: 计数从 start 开始。默认是从 0 开始。例如range&#xff08;5&#xff09;等价于range&#…

【Python学习】 简单语法与常见错误(持续更新)

关于单引号和双引号 当输出的字符串内部没有单引号的时候&#xff0c;外面可以用单引号&#xff0c; 但是如果内部有了单引号&#xff0c;那么外部只能用双引号。 dict {Name: Zara, Age: 7, Class: First} print(dict) print (dict[Name]: , dict[Name]) print ("dic…

一步步编写操作系统 78 intel汇编与ATT汇编语法区别

本节咱们介绍下intel汇编语法和at&t汇编语法的区别。 以上表中未列出这两种语法在内存寻址方面的差异&#xff0c;个人觉得区别还是很大的&#xff0c;下面单独说说。 在Intel语法中&#xff0c;立即数就是普通的数字&#xff0c;如果让立即数成为内存地址&#xff0c;需要…

重读经典:《Masked Autoencoders Are Scalable Vision Learners》

MAE 论文逐段精读【论文精读】这一次李沐博士给大家精读的论文是 MAE&#xff0c;这是一篇比较新的文章&#xff0c;2021年11月11日才上传到 arXiv。这篇文章在知乎上的讨论贴已经超过了一百万个 view&#xff0c;但是在英文社区&#xff0c;大家反应比较平淡一点&#xff0c;R…

【Python学习日志】 - Numpy包

NumPy是什么&#xff1f; 使用Python进行科学计算的基础包&#xff0c;在数据分析的时候比较常用到矩阵计算。这时太多的Np属性不记得&#xff0c;所以方便自己使用把一些常用的Np属性汇总记录一下使用的时候方便查找。 ndarray.ndim 阵列的轴数&#xff08;尺寸&#xff09;…

详解协同感知数据集OPV2V: An Open Benchmark Dataset and Fusion Pipeline for Perception with V2V Communication

在《详解自动驾驶仿真框架OpenCDA: An Open Cooperative Driving Automation Framework Integrated with Co-Simulation》 一文中介绍了自动驾驶仿真框架 OpenCDA。本文将介绍论文作者另一篇最新工作 OPV2V&#xff0c;论文收录于 ICRA2022。 OPV2V 数据集主要 feature 有&…

【Python学习】 - 如何在Spyder中弹出plot绘图窗口而不是在Console中绘图

依次选择这几项&#xff1a; 点击ok确认。 注意&#xff1a;点击ok之后不会立即生效&#xff0c;重启Spyder之后才会生效

mysql系列:加深对脏读、脏写、可重复读、幻读的理解

关于相关术语的专业解释&#xff0c;请自行百度了解&#xff0c;本文皆本人自己结合参考书和自己的理解所做的阐述&#xff0c;如有不严谨之处&#xff0c;还请多多指教。 **不可重复读的重点是修改: **同一事务&#xff0c;两次读取到的数据不一样。 幻读的重点在于新增或者…

重读经典(点云深度学习开山之作):《Deep learning on point clouds for 3D scene understanding》(持续更新中)

本文介绍的是 PointNet 作者的博士论文&#xff1a;3D场景理解中的点云深度学习。从上图可以看到&#xff0c;整个博士论文主要贡献有两块&#xff1a;一是点云深度学习的网络架构&#xff08;PointNet 和 PointNet&#xff09;&#xff1b;二是在3D场景理解中的应用&#xff0…

Coursera自动驾驶课程第17讲:An Autonomous Vehicle State Estimator

在第16讲《Coursera自动驾驶课程第16讲&#xff1a;LIDAR Sensing》我们学习了自动驾驶目前常用的3D 传感器&#xff0c;激光雷达&#xff0c;了解了激光雷达的工作原理&#xff0c;掌握了对点云数据的操作以及如何使用点云配准方法来进行汽车定位。 回顾一下&#xff0c;在本…

!何为脏读、不可重复读、幻读

2.0、前言 事务的隔离性是指多个事务并发执行的时候相互之间不受到彼此的干扰的特性&#xff0c;隔离性是事务ACID特性中的I&#xff0c;根据隔离程度从低到高分为Read Uncommitted&#xff08;读未提交&#xff09;&#xff0c;Read Committed&#xff08;读已提交&#xff0…

【转】JPA、Hibernate和Mybatis区别和总结

很多人都用过java的数据库连接池C3P0&#xff0c;但官方没有说明名称的由来。 据传闻&#xff1a;连接池作者是《星球大战》迷&#xff0c;C3P0就是其中的一个机器人&#xff0c;并且这个名称中包涵connection 和pool的单词字母。因此叫这个名字&#xff08;根据网友提醒&…

详解3D物体检测模型: Voxel Transformer for 3D Object Detection

本文介绍一个新的的3D物体检测模型&#xff1a;VoTr&#xff0c;论文已收录于ICCV 2021。 这是第一篇使用 voxel-based Transformer 做3D 主干网络&#xff0c;用于点云数据3D物体检测。由于有限的感受野&#xff0c;传统的 3D 卷积网络检测器&#xff08;voxel-based&#xff…

一步步编写操作系统 65 标准调用约定stdcall 汇编实战

因为c语言遵循的调用约定是cdecl&#xff0c;咱们也自然要遵守cdecl约定了。不过为了起到对比的作用&#xff0c;除了介绍cdecl外&#xff0c;也会介绍下stdcall。 既然咱们用的是调用约定是cdecl&#xff0c;那对它的介绍最好让它离下一节的内容近一些&#xff0c;所以先说一…