All You Can Code 2008 (Romanian Contest) A - Tree Search
思路:
经典树形dp
dp[i][0]表示i的子树中以i为端点的最大链
dp[i][1]表是整棵树中除去i的子树剩下的部分以i为端点的最大链
最后答案就是以i为端点的最大链和次大链拼起来(除了一些特殊情况,比如一条链更大,或者只有一条链)
代码:
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head const int N = 1e5 + ;
vector<int> g[N];
int a[N], ans[N];
int dp[N][];
void dfs1(int u, int o) {
dp[u][] = a[u];
for (int v : g[u]) {
if(v != o) {
dfs1(v, u);
dp[u][] = max(dp[u][], a[u] + dp[v][]);
}
}
}
void dfs2(int u, int o) {
if(u == ) dp[u][] = a[u];
int v1, mx1 = INT_MIN, v2, mx2 = INT_MIN;
for (int v : g[u]) {
if(v != o) {
int tmp = dp[v][] + a[u];
if(tmp > mx1) {
mx2 = mx1;
v2 = v1;
mx1 = tmp;
v1 = v;
}
else if(tmp == mx1 || tmp > mx2) {
mx2 = tmp;
v2 = v;
}
}
}
if(dp[u][] > mx1) {
mx2 = mx1;
v2 = v1;
mx1 = dp[u][];
v1 = -;
}
else if(dp[u][] == mx1 || dp[u][] > mx2){
mx2 = dp[u][];
v2 = -;
}
ans[u] = a[u];
if(mx1 != INT_MIN && mx2 != INT_MIN) ans[u] = max(ans[u], mx1 + mx2 - a[u]);
else if(mx1 != INT_MIN) ans[u] = max(ans[u], mx1);
else ans[u] = max(ans[u], mx2);
ans[u] = max(ans[u], mx1);
ans[u] = max(ans[u], mx2);
for (int v : g[u]) {
if(v != o) {
dp[v][] = a[v];
if(v == v1) {
dp[v][] = max(dp[v][], mx2 + a[v]);
}
else {
dp[v][] = max(dp[v][], mx1 + a[v]);
}
dfs2(v, u);
}
} }
int main() {
int n, m, u, v, q;
scanf("%d %d", &n, &m);
for (int i = ; i <= n; i++) scanf("%d", &a[i]);
for (int i = ; i < n; i++) {
scanf("%d %d", &u, &v);
g[u].pb(v);
g[v].pb(u);
}
dfs1(, );
dfs2(, );
while(m--) {
scanf("%d", &q);
printf("%d\n", ans[q]);
}
return ;
}
All You Can Code 2008 (Romanian Contest) A - Tree Search的更多相关文章
- @atcoder - CODE FESTIVAL 2017 Final - J@ Tree MST
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点,第 i 点有一个点权 Xi,再给定一棵边带权的树 ...
- #Leet Code# Convert Sorted Array to Binary Search Tree
描述:递归 代码: class Solution: # @param num, a list of integers # @return a tree node def sortedArrayToBS ...
- [CODE FESTIVAL 2016]Problem on Tree
题意:给一棵树,对于一个满足以下要求的序列$v_{1\cdots m}$,求最大的$m$ 对$\forall1\leq i\lt m$,路径$(v_i,v_{i+1})$不包含$v$中除了$v_i,v ...
- Leet Code OJ 226. Invert Binary Tree [Difficulty: Easy]
题目: Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 思路分析: 题意是将二叉树全部左右子数 ...
- Code Forces Bear and Forgotten Tree 3 639B
B. Bear and Forgotten Tree 3 time limit per test2 seconds memory limit per test256 megabytes inputst ...
- The 2019 ICPC Asia Shanghai Regional Contest H Tree Partition k、Color Graph
H题意: 给你一个n个节点n-1条无向边构成的树,每一个节点有一个权值wi,你需要把这棵树划分成k个子树,每一个子树的权值是这棵子树上所有节点权值之和. 你要输出这k棵子树的权值中那个最大的.你需要让 ...
- IOCCC(The International Obfuscated C Code Contest)
国际 C 语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从 1984 年开始,每年举办一次(1997年.1 ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) B. Code obfuscation 水题
B. Code obfuscation 题目连接: http://codeforces.com/contest/765/problem/B Description Kostya likes Codef ...
- Code obfuscatio (翻译!)
Description Kostya likes Codeforces contests very much. However, he is very disappointed that his so ...
随机推荐
- centOs6.5配置启动ssh
.非root用户则执行su或su - 或su root或su - root切换为root用户 2.查看SSH是否安装(检查是否装了SSH包) 输入命令:rpm -qa | grep ssh 注:若没安 ...
- CentOS中service命令与/etc/init.d的关系以及centos7的变化
缘由 由于个人经常在ubuntu和centos 系统中切换,习惯了以前的 ubuntu中 通过 /etc/init.d/xxx 进行软件服务控制.后来发现centos7中换了服务的控制方式:servi ...
- openERP笔记,自定义开发模块
##目标 OpenERP模块基本结构 使用模块添加额外的字段(Date Required和Rush Order) 扩展视图, 让OpenERP能够显示新的字段 修改用于OpenERP工作流的可用状态 ...
- ES6 Class 类
在ES6中,class (类)作为对象的模板被引入,可以通过 class 关键字定义类. class 的本质是 function. 它可以看作一个语法糖,让对象原型的写法更加清晰.更像面向对象编程的语 ...
- 洛谷P3455 ZAP-Queries [POI2007] 莫比乌斯反演+数论分块
正解:莫比乌斯反演 解题报告: 传送门! 首先这题刚看到就很,莫比乌斯反演嘛,和我前面写了题解的那个一模一样的,所以这儿就不讲这前边的做法辣QAQ 但是这样儿还有个问题,就现在已知我每次都是要O(n) ...
- I2C驱动框架 (kernel-3.4.2)
先用韦老师的图: 注: 新版本内核的i2c驱动框架采用了 i2c_client -------> i2c_bus_type <-------- i2c_driver 框架 如 ...
- js/jquery 元素是否存在
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>spli ...
- 【Algorithm】-NO.140.Algorithm.1.Algorithm.1.001-【空间复杂度 时间复杂度 o(1), o(n), o(logn), o(nlogn)】-
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 取数游戏II
传送门 #include <bits/stdc++.h> using namespace std; #define ll long long #define re register #de ...
- Centos配置tomcat服务并且开机自启动
把要配置成服务的tomcat文件夹中的catalina.sh脚本文件拷一份到/etc/init.d目录,并且改文件名称为tomcat6 cp /usr/web/tomcat/tomcat-/bin/c ...