题目链接:codeforces 1065F Up and Down the Tree

题意:给出一棵树的节点数\(n\)以及一次移动的最大距离\(k\),现在有一个标记在根节点1处,每一次可以进行一下的两个操作之一:

1、将标记移动至当前节点的子树中的某一个叶子

2、将当前标记向上移,向上移的距离不得超过\(k\)

求最多可以访问到多少个叶子结点

分析:一看就知道应该用树形dp去维护它

我们记\(dp[u]\)表示以\(u\)为根节点的子树中最多可以访问多少个叶子结点

\(dp[u]\)由两部分组成:一是跳到下面的节点再跳回\(u\)的叶子结点个数,二是跳到\(u\)的某一棵子树中不再跳回\(u\)时可以访问到的叶子结点个数

为了维护这个我们再记两个辅助数组\(dis[u]\)表示距离\(u\)最近的叶子结点的距离,\(back[u]\)表示在\(u\)的子树中跳到\(u\)再跳回来\(u\)时可以访问到的叶子结点个数

那么这两个数组的维护是显而易见的

对于\(dp\)数组的维护,第一部分就是\(back[u]\),直接加上即可

对于第二部分,我们要考虑的是\(u\)应该往哪一棵子树跳,由于能跳回来的已经在1中计算过了,我们在这里也就不能考虑这一部分,因此是选取最大的\(dp[v]-back[v]\)去跳

最后注意在\(dis[u]\geq k\)时,由于此时的\(back[u]\)已经对它的父亲节点不会再存在贡献,直接清零即可

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const int maxd=1e9+7;
struct node{
int to,nxt;
}sq[2001000];
int n,k,head[1001000],all=0,dp[1001000],dis[1001000],back[1001000]; int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
} void add(int u,int v)
{
all++;sq[all].to=v;sq[all].nxt=head[u];head[u]=all;
} void dfs(int u,int fa)
{
dis[u]=maxd;int i;
for (i=head[u];i;i=sq[i].nxt)
{
int v=sq[i].to;
if (v==fa) continue;
dfs(v,u);
dis[u]=min(dis[u],dis[v]+1);
back[u]+=back[v];
dp[u]=max(dp[u],dp[v]-back[v]);
}
dp[u]+=back[u];
if (dis[u]==maxd) {dis[u]=0;dp[u]=back[u]=1;}
if (dis[u]>=k) back[u]=0;
} int main()
{
n=read();k=read();
int i;
for (i=2;i<=n;i++)
{
int v=read();add(i,v);add(v,i);
}
memset(dp,0,sizeof(dp));
memset(dis,0,sizeof(dis));
memset(back,0,sizeof(back));
dfs(1,0);
printf("%d",dp[1]);
return 0;
}

codeforces 1065F Up and Down the Tree的更多相关文章

  1. Codeforces 914H Ember and Storm's Tree Game 【DP】*

    Codeforces 914H Ember and Storm's Tree Game 题目链接 ORZ佬 果然出了一套自闭题 这题让你算出第一个人有必胜策略的方案数 然后我们就发现必胜的条件就是树上 ...

  2. Codeforces Round #499 (Div. 1) F. Tree

    Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...

  3. Up and Down the Tree CodeForces - 1065F (树形dp)

    链接 题目大意:给定$n$结点树, 假设当前在结点$v$, 有两种操作 $(1)$移动到$v$的子树内任意一个叶子上 $(2)$若$v$为叶子, 可以移动到距离$v$不超过$k$的祖先上 初始在结点$ ...

  4. Educational Codeforces Round 6 E. New Year Tree dfs+线段树

    题目链接:http://codeforces.com/contest/620/problem/E E. New Year Tree time limit per test 3 seconds memo ...

  5. Codeforces Round #353 (Div. 2) D. Tree Construction 二叉搜索树

    题目链接: http://codeforces.com/contest/675/problem/D 题意: 给你一系列点,叫你构造二叉搜索树,并且按输入顺序输出除根节点以外的所有节点的父亲. 题解: ...

  6. Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA链上最大值

    E. Minimum spanning tree for each edge 题目连接: http://www.codeforces.com/contest/609/problem/E Descrip ...

  7. Codeforces 600E. Lomsat gelral(Dsu on tree学习)

    题目链接:http://codeforces.com/problemset/problem/600/E n个点的有根树,以1为根,每个点有一种颜色.我们称一种颜色占领了一个子树当且仅当没有其他颜色在这 ...

  8. Codeforces Round #540 (Div. 3)--1118F1 - Tree Cutting (Easy Version)

    https://codeforces.com/contest/1118/problem/F1 #include<bits/stdc++.h> using namespace std; in ...

  9. Codeforces Round #353 (Div. 2) D. Tree Construction 模拟

    D. Tree Construction 题目连接: http://www.codeforces.com/contest/675/problem/D Description During the pr ...

随机推荐

  1. Mac 下编译安装 php-5.6

    1.安装 PHP 1.1 下载源码包 http://php.net/get/php-5.6.35.tar.bz2/from/a/mirror 1.2 编译&安装 ./configure --p ...

  2. 数组去重--ES5和ES6

    思路:把去重后的数组放到一个空数组中 ES5实现: function uni(arr) { var result = []; for (var i=0;i<arr.length;i++) { i ...

  3. H5 类选择器

    10-类选择器 错误的写法: --> 迟到毁一生 早退穷三代 按时上下班 必成高富帅 我是段落 我是段落 <!DOCTYPE html> <html lang="en ...

  4. Achievements

    看了Suma,觉得懂了85%以上. 两个月可以学这么多.方法是不懂的就学就行了. 最近学了:字符串,网络流,线段树,斯特林反演,多项式与生成函数,一些数论等.

  5. webpack之loader和plugin简介

    webpack之loader和plugin简介 webpack入门和实战(二):全面理解和运用loader和plugins webpack入门(四)——webpack loader 和plugin w ...

  6. 微服务治理平台的RPC方案实现

    导读:本文主要探讨了rpc框架在微服务化中所处的位置,需要解决的问题.同时介绍了用友云微服务治理平台的rpc解决方案,为什么选择该方案.该方案提供的好处是什么.同时也会介绍用友RPC框架的基本结构以及 ...

  7. Error Boundaries 错误边界

    错误边界是用于捕获其子组件树 JavaScript 异常,记录错误并展示一个回退的 UI 的 React 组件,而不是整个组件树的异常.错误边界在渲染期间.生命周期方法内.以及整个组件树构造函数内捕获 ...

  8. C#复习笔记(3)--C#2:解决C#1的问题(结束C#2的内容:最后一些特性)

    结束C#2的内容:最后一些新性 这是本章要讲的内容: 分部类型:可以在多个源文件中为 一个类型编写代码. 特别适用于部分代码是自动生成, 而其他部分的代码为手写的类型. 静态类:对工具类进行整理, 以 ...

  9. 下拉框插件select2的使用

    它的优点有: 样式还算好看,支持多选,支持索搜 下面来介绍下select2的用法 1.最简单的用法 只需要加载css和js即可使用 <select name="" id=&q ...

  10. CentOS7安装k8s

    借鉴博客:https://www.cnblogs.com/xkops/p/6169034.html 此博客里面有每个k8s配置文件的注释:https://blog.csdn.net/qq_359048 ...