2019 年百度之星·程序设计大赛 - 复赛 A: Diversity(树形dp)

Problem Description

给你一棵n个点的树,对于节点i,你要给它标上一个[li,ri]之间的数,要求所有边两端节点上标的数字的差的绝对值的总和最大。

 

 

Input

第一行一个整数T(1≤T≤5)表示数据组数。对于每组数据格式如下。

第一行一个正整数 n(2≤n≤105)。

接下来n−1行,每行两个正整数 u,v(1≤u,v≤n),表示一条边。

接下来n行,第i行两个正整数li,ri(1≤li≤ri≤109)。

 

 

Output

对于每组数据,一个整数表示答案。

 

 

Sample Input

 

1 5 1 2 2 3 3 4 4 5 1 5 2 7 7 9 5 8 3 4

 

 

Sample Output

 

16

 

 

Source

2019 年百度之星·程序设计大赛 - 复赛

 

 

Recommend

heyang   |   We have carefully selected several similar problems for you:  6730 6729 6728 6727 6726 

 

 

Statistic | Submit | Discuss | Note

①首先考虑, 每个点取数, 最终最优的答案一定是每个点取两端的数之一

②设d[i][2],其中 d[i][0] 表示当前节点取左端的数字表示第i个节点取左边的数字, d[i][1]表示第i个节点取右边的数字。

一共四种情况, 即LR, LL, RL, RR。 dfs一下即可。

#include 
#include 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

#ifdef LOCAL
#define debug(x) cout << "[" __FUNCTION__ ": " #x " = " << (x) << "]\n"
#define TIME cout << "RuningTime: " << clock() << "ms\n", 0
#else
#define TIME 0
#endif
#define hash_ 1000000009
#define Continue(x) { x; continue; }
#define Break(x) { x; break; }
const int N = 1e5 + 10;
const int mod = 998244353;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
vectorG[N];
ll d[N][2]; // 0取左端 1取右端
int l[N], r[N];
void dfs(int now, int fa)
{
	for (auto &i : G[now])
	{
		if (i == fa)
			continue;
		dfs(i, now);
		d[now][0] += max(abs(l[now] - l[i]) + d[i][0], abs(l[now] - r[i]) + d[i][1]);
		d[now][1] += max(abs(r[now] - l[i]) + d[i][0], abs(r[now] - r[i]) + d[i][1]);
	}
}
int main(){
#ifdef LOCAL
	freopen("D:/input.txt", "r", stdin);
#endif
	int t;
	cin >> t;
	while (t--)
	{
		memset(d, 0, sizeof d);
		int n;
		cin >> n;
		for (int i = 1; i < n; i++)
		{
			int L, R;
			scanf("%d%d", &L, &R);
			G[L].push_back(R);
			G[R].push_back(L);
		}
		for (int i = 1; i <= n; i++)
		{
			scanf("%d%d", &l[i], &r[i]);
		}
		dfs(1, 0);
		cout << max(d[1][0], d[1][1]) << endl;
		for (int i = 1; i <= n; i++)
		{
			G[i].clear();
		}
	}
	return TIME;
}

 

你可能感兴趣的:(2019 年百度之星·程序设计大赛 - 复赛 A: Diversity(树形dp))