原题直通车: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. 设置COOKIE过期时间的方法

    第一,日期运算法 1)将期限设置为当前日期后的第N天的0时0分0秒 Response.Cookies(LastView).Expires=dateadd(d,N,date) 2)将期限设置为当前日期后 ...

  2. hdu 1885 Key Task (三维bfs)

    题目 之前比赛的一个题, 当时是崔老师做的,今天我自己做了一下.... 还要注意用bfs的时候  有时候并不是最先到达的就是答案,比如HDU 3442 这道题是要求最小的消耗血量伤害,但是并不是最先到 ...

  3. nginx - conf.d vs sites-available

    自己理解: conf.d - 扩展配置文件,用户配置文件 sites-available - 配置 虚拟主机(nginx支持多个虚拟主机,sites-enabled(存放 软链接,指向sites-av ...

  4. Swift入门篇-swift简介

    潜水博客园很多年,闲来无事,聊一下自己的经历,语文不好(如有什么错别字,请您在下评论)望您谅解,没有上过什么学的 在前期 ios入门篇 -hello Word(1) 文章中介绍我这半年准备写一些ios ...

  5. 《C++ Primer 4th》读书笔记 第12章-类

    原创文章,转载请注明出处:http://www.cnblogs.com/DayByDay/p/3936473.html

  6. 一天一个Java基础——序列化

    1.概念 Java的“对象序列化”能将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象的时候,能把这些byte数据恢复出来,并据此重新构建那个对象. 对象序列化能实 ...

  7. C#中使用visio控件

    C#中使用visio控件 2012-08-25 18:14:19|  分类: 技术相关|举报|字号 订阅     其实就是C#访问VISIO的自动化模型,以前做了不少C#和Excle及word 的交互 ...

  8. MySQL数据库分布式事务XA优缺点与改进方案

    1 MySQL 外部XA分析 1.1 作用分析 MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,例如开源的代理工具:ameoba[4],网易的DDB,淘宝的 ...

  9. 【LR】录制测试脚本中的基本菜单

    学习来源: MBoo,小强老师性能测试及Loadrunner培训  ——录制测试脚本: 1.Vuser -> run-time settings ->General Run Logic : ...

  10. 完全参照系统自带的DatePickerDialog、TimePickerDialog的源代码仿写的DateTimePickerDialog

    完全参照系统自带的DatePickerDialog.TimePickerDialog的源代码仿写的DateTimePickerDialog.具有同时选择日期.时间的功能.在2.2.2.3平台,显示的效 ...