原题直通车:codeforces 337D Book of Evil

题意:一棵n个结点的树上可能存在一个Evil,Evil危险范围为d,即当某个点与它的距离x<=d时,那么x是危险的。

现已知道有m个点是危险的,问那个Evil可能存的点有多少。

分析: 昨晚傻X地暴力提交,自然得到的是TLE。今天看一神的代码才突然明白……

跟以往的题一样,两个DFS就可求出答案。

第一个DFS搜出所有危险点,并求出枝干上的点到最远的危险点的距离。

第二次DFS再往回遍历。具体的参考代码。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=111111;
vector<int>Tree[maxn];
int deep[maxn];
int n,m,d,ans;
bool vis[maxn],vid[maxn];
void DFS(int cnt){
vis[cnt]=true;
deep[cnt]=-1;
if(vid[cnt]) deep[cnt]=0;
int len=Tree[cnt].size();
for(int i=0;i<len;++i){
int son=Tree[cnt][i];
if(vis[son]) continue;
DFS(son);
deep[cnt]=max(deep[cnt],deep[son]+(deep[son]==-1?0:1));
}
}
void DFS_DP(int cnt,int up){
if(up<=d&&deep[cnt]<=d) ans++;
vis[cnt]=true;
int len=Tree[cnt].size();
vector<int>P,S;
for(int i=0;i<len;++i) {
int son=Tree[cnt][i];
if(vis[son]) continue;
P.push_back(deep[son]==-1?-1:(deep[son]+2));//兄弟结点-->父亲结点-->自身,所以得+2步
S.push_back(son);
}
int ls=S.size();
if(ls==0) return;
vector<int>L(ls),R(ls);
int Max=-1; //下面两循环是为了求出所有兄弟结点的最大deep值。
for(int i=0;i<ls;++i){
L[i]=Max;
if(P[i]>Max) Max=P[i];
}
Max=-1;
for(int i=ls-1;i>=0;--i){
R[i]=Max;
if(P[i]>Max) Max=P[i];
}
for(int i=0;i<ls;++i){
int newup=(up==-1?-1:(up+1));
newup=max(newup,max(L[i],R[i]));
if(vid[cnt]&&newup<1) newup=1;
DFS_DP(S[i],newup);
}
}
int main(){
cin>>n>>m>>d;
for(int i=1;i<=m;++i){
int a; cin>>a; vid[a]=true;
}
for(int i=1;i<n;++i) {
int a,b; cin>>a>>b;
Tree[a].push_back(b);
Tree[b].push_back(a);
}
DFS(1);
memset(vis,false,sizeof(vis));
ans=0;
DFS_DP(1,-1);
cout<<ans<<endl;
return 0;
}

codeforces 337D 树形DP Book of Evil的更多相关文章

  1. CodeForces - 337D 树形dp

    题意:一颗树上有且仅有一只恶魔,恶魔会污染距离它小于等于d的点,现在已经知道被污染的m个点,问恶魔在的可能结点的数量. 容易想到,要是一个点到(距离最远的两个点)的距离都小于等于d,那么这个点就有可能 ...

  2. Codeforces 1153D 树形DP

    题意:有一个游戏,规则如下:每个点有一个标号,为max或min, max是指这个点的值是所有子节点中值最大的那一个,min同理.问如何给这颗树的叶子节点赋值,可以让这棵树的根节点值最大. 思路:很明显 ...

  3. Codeforces 1088E 树形dp+思维

    比赛的时候看到题意没多想就放弃了.结果最后D也没做出来,还掉分了,所以还是题目做的太少,人太菜. 回到正题: 题意:一棵树,点带权值,然后求k个子连通块,使得k个连通块内所有的点权值相加作为分子除以k ...

  4. Codeforces 1179D 树形DP 斜率优化

    题意:给你一颗树,你可以在树上添加一条边,问添加一条边之后的简单路径最多有多少条?简单路径是指路径中的点只没有重复. 思路:添加一条边之后,树变成了基环树.容易发现,以基环上的点为根的子树的点中的简单 ...

  5. CodeForces 219D 树形DP

    D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...

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

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

  7. codeforces 1053D 树形DP

    题意:给一颗树,1为根节点,有两种节点,min或者max,min节点的值是它的子节点的值中最小的,max节点的值是它的子节点的值中最大的,若共有k个叶子,叶子的值依次为1~k. 问给每个叶子的值赋为几 ...

  8. Codeforces 1120D (树形DP 或 最小生成树)

    题意看这篇博客:https://blog.csdn.net/dreaming__ldx/article/details/88418543 思路看这篇:https://blog.csdn.net/cor ...

  9. Codeforces 735E 树形DP

    题意:给你一棵树,你需要在这棵树上选择一些点染成黑色,要求染色之后树中任意节点到离它最近的黑色节点的距离不超过m,问满足这种条件的染色方案有多少种? 思路:设dp[x][i]为以x为根的子树中,离x点 ...

随机推荐

  1. hdu 4864 Task (贪心 技巧)

    题目链接 一道很有技巧的贪心题目. 题意:有n个机器,m个任务.每个机器至多能完成一个任务.对于每个机器,有一个最大运行时间xi和等级yi, 对于每个任务,也有一个运行时间xj和等级yj.只有当xi& ...

  2. 修改数据库中group_concat的返回结果的长度限制

    修改数据库中group_concat的返回结果的长度限制 我们可以使用Mysql的客户端管理工具,Sqlyog 新建一个查询编辑器 显示  SHOW VARIABLES LIKE "grou ...

  3. Delphi反汇编内部字符串处理函数/过程不完全列表

    Delphi反汇编内部字符串处理函数/过程不完全列表 名称 参数 返回值 作用 等价形式 / 备注   _PStrCat EAX :目标字符串 EDX :源字符串 EAX 连接两个 Pascal 字符 ...

  4. 【C#学习笔记】播放wma/mp3文件

    using System; using System.Runtime.InteropServices; namespace ConsoleApplication { class Program { [ ...

  5. 【C#学习笔记】读文件

    using System; using System.IO; namespace ConsoleApplication { class Program { static void Main(strin ...

  6. squid+nginx+apache

    一.前言 二.编译安装 三.安装MySQL.memcache 四.安装Apache.PHP.eAccelerator.php-memcache 五.安装Squid 六.后记 一.前言,准备工作当前,L ...

  7. ActionBarSherlock的学习笔记(三) ------------ ActionBarSherlock中的overflow及item的点击事件

    定义一个自定义的ActionBar的title,并添加一个overflow的Action   Item. 代码实现 如下  : import android.os.Bundle; import and ...

  8. Mac 配置jdk

    1.打开终端,开始操作 cd ~touch.bash_profile vi .bash_profile 2.在此文本中添加以下内容 export JAVA_HOME=/Library/Java/Jav ...

  9. 【转】APUE习题4.6---测试lseek作用

    原文网址:http://m.blog.csdn.net/blog/u014488381/42556509 原题:如果使用追加标志打开一个文件以便读.写,能否仍用 lseek 在任一为止开始读?能否用 ...

  10. Ruby窗口程序

    require 'tk' tkroot=TkRoot.new { title 'hellw word' geometry '300x200' } lb = TkLabel.new(tkroot) do ...