E - Preorder Test

思路:想到二分答案了之后就不难啦, 对于每个答案用树形dp取check, 如果二分的值是val, dp[ i ]表示 i 这棵子树答案不低于val的可以访问的

最多节点, 第二次dfs求出以每个点为根的答案。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PII pair<int, int>
#define PLI pair<LL, int>
#define ull unsigned long long
using namespace std; const int N = 2e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-; int n, k, a[N], dp[N], sz[N], mx[N], mx2[N];
vector<int> edge[N]; void dfs1(int u, int fa, int val) {
sz[u] = ;
mx[u] = , mx2[u] = , dp[u] = ;
for(int v : edge[u]) {
if(v == fa) continue;
dfs1(v, u, val);
sz[u] += sz[v];
if(dp[v] == sz[v]) dp[u] += dp[v];
else {
if(dp[v] >= mx[u]) mx2[u] = mx[u], mx[u] = dp[v];
else if(dp[v] > mx2[u]) mx2[u] = dp[v];
}
}
dp[u] += mx[u];
if(a[u] < val) dp[u] = ;
}
void dfs2(int u, int fa, int cnt, int val, int &ans) {
if(!dp[u]) {
for(int v : edge[u]) {
if(v == fa) continue;
dfs2(v, u, , val, ans);
}
} else {
int ret = dp[u];
if(cnt == n - sz[u]) ret = max(ret, dp[u] + cnt);
else if(cnt > mx[u]) ret = max(ret, dp[u] - mx[u] + cnt), mx2[u] = mx[u], mx[u] = cnt;
else if(cnt > mx2[u]) mx2[u] = cnt;
ans = max(ans, ret);
for(int v : edge[u]) {
if(v == fa) continue;
if(dp[v] == sz[v]) dfs2(v, u, ret-dp[v], val, ans);
else if(dp[v] == mx[u]) dfs2(v, u, ret-mx[u]+mx2[u], val, ans);
else dfs2(v, u, ret, val, ans);
}
}
} bool check(int val) {
dfs1(, , val);
int ans = ;
dfs2(, , , val, ans);
return ans >= k;
} int main() {
scanf("%d%d", &n, &k);
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
for(int i = ; i < n; i++) {
int u, v; scanf("%d%d", &u, &v);
edge[u].push_back(v);
edge[v].push_back(u);
}
int low = , high = , ans = ;
while(low <= high) {
int mid = low + high >> ;
if(check(mid)) ans = mid, low = mid + ;
else high = mid - ;
}
printf("%d\n", ans);
return ;
} /*
*/

8VC Venture Cup 2016 - Final Round (Div. 1 Edition) E - Preorder Test 树形dp的更多相关文章

  1. 8VC Venture Cup 2016 - Final Round (Div. 2 Edition)

    暴力 A - Orchestra import java.io.*; import java.util.*; public class Main { public static void main(S ...

  2. 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) A

    A. Orchestra time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  3. 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) D. Factory Repairs 树状数组

    D. Factory Repairs 题目连接: http://www.codeforces.com/contest/635/problem/D Description A factory produ ...

  4. 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) C. XOR Equation 数学

    C. XOR Equation 题目连接: http://www.codeforces.com/contest/635/problem/C Description Two positive integ ...

  5. 8VC Venture Cup 2016 - Final Round (Div. 2 Edition)B. sland Puzzle 水题

    B. sland Puzzle 题目连接: http://www.codeforces.com/contest/635/problem/B Description A remote island ch ...

  6. 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) A. Orchestra 水题

    A. Orchestra 题目连接: http://www.codeforces.com/contest/635/problem/A Description Paul is at the orches ...

  7. Codeforces Round #393 (Div. 2) (8VC Venture Cup 2017 - Final Round Div. 2 Edition) E - Nikita and stack 线段树好题

    http://codeforces.com/contest/760/problem/E 题目大意:现在对栈有m个操作,但是顺序是乱的,现在每输入一个操作要求你输出当前的栈顶, 注意,已有操作要按它们的 ...

  8. Codeforces Round #393 (Div. 2) (8VC Venture Cup 2017 - Final Round Div. 2 Edition) D - Travel Card

    D - Travel Card 思路:dp,类似于单调队列优化. 其实可以写的更简单... #include<bits/stdc++.h> #define LL long long #de ...

  9. Codeforces Round #393 (Div. 2) (8VC Venture Cup 2017 - Final Round Div. 2 Edition)A 水 B 二分 C并查集

    A. Petr and a calendar time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

随机推荐

  1. day13 类的补充

    访问修饰符                          同包                          不同包 本类         子类         非子类        子类   ...

  2. VS2010(32bit) + WIN7(64bit) 编译出不同平台程序版本

    一.X86,即一般普通PC上跑的程序版本,不用修改工程属性 二.X64 1.设置工程平台---会在工程目录下生成  X64 文件夹 在工具栏--->生成--->配置管理器 窗口 设置“活动 ...

  3. Storm实现实时大数据分析

    当今世界,公司的日常运营经常会生成TB级别的数据.数据来源囊括了互联网装置可以捕获的任何类型数据,网站.社交媒体.交易型商业数据以及其它商业环境中创建的数据.考虑到数据的生成量,实时处理成为了许多机构 ...

  4. Java并发编程原理与实战三十八:多线程调度器(ScheduledThreadPoolExecutor)

    在前面介绍了java的多线程的基本原理信息:线程池的原理与使用 本文对这个java本身的线程池的调度器做一个简单扩展,如果还没读过上一篇文章,建议读一下,因为这是调度器的核心组件部分. 我们如果要用j ...

  5. Shader 学习工具篇 可视化公式工具ZGrapher

    大家好,我是怒风,本篇介绍公式可视化公式工具ZGrapher,尝试通过可视化的方式分析一下Shader中应用的公式,以求帮助初学者快速理解Shader编程中的一些常用公式 本篇的目的两个, 第一,介绍 ...

  6. C语言入门教程-(1)简介及搭建环境

    1.谁适合阅读本教程 本教程可以帮助大家从零开始学习C语言,对于有一定基础的人起到夯实基本功的作用.C语言容易学习,非常适合初学者入门,而且也为以后的编程打下基础.借用一句话:“要进入编程行业高手必学 ...

  7. js操作控制iframe页面的dom元素

    1.代码1  index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  8. 42、Java装饰者设计模式

    设计模式简介 什么是设计模式?设计模式是可以重复利用的解决方案.软件开发的先驱或者前辈们将之前在开发中遇到的问题进行总结并给出了解决方案,后辈在遇到这些问题之后直接使用这些方案即可解决问题.比如盖高楼 ...

  9. Kissy && Require

    KISSY add(name?,factory?,deps)  函数挂载在全局对象KISSY上,用来定义模块.   一个 JS 文件包含一个add()(这时路径+文件名可以用作模块名),如果一个文件包 ...

  10. bootstrap_bootstrap中日历范围选择插件daterangepicker的使用

    1.引入脚本 <link rel="stylesheet" type="text/css" href="assets/css/bootstrap ...