codeforces 337D 树形DP Book of Evil
原题直通车: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的更多相关文章
- CodeForces - 337D 树形dp
题意:一颗树上有且仅有一只恶魔,恶魔会污染距离它小于等于d的点,现在已经知道被污染的m个点,问恶魔在的可能结点的数量. 容易想到,要是一个点到(距离最远的两个点)的距离都小于等于d,那么这个点就有可能 ...
- Codeforces 1153D 树形DP
题意:有一个游戏,规则如下:每个点有一个标号,为max或min, max是指这个点的值是所有子节点中值最大的那一个,min同理.问如何给这颗树的叶子节点赋值,可以让这棵树的根节点值最大. 思路:很明显 ...
- Codeforces 1088E 树形dp+思维
比赛的时候看到题意没多想就放弃了.结果最后D也没做出来,还掉分了,所以还是题目做的太少,人太菜. 回到正题: 题意:一棵树,点带权值,然后求k个子连通块,使得k个连通块内所有的点权值相加作为分子除以k ...
- Codeforces 1179D 树形DP 斜率优化
题意:给你一颗树,你可以在树上添加一条边,问添加一条边之后的简单路径最多有多少条?简单路径是指路径中的点只没有重复. 思路:添加一条边之后,树变成了基环树.容易发现,以基环上的点为根的子树的点中的简单 ...
- CodeForces 219D 树形DP
D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...
- Up and Down the Tree CodeForces - 1065F (树形dp)
链接 题目大意:给定$n$结点树, 假设当前在结点$v$, 有两种操作 $(1)$移动到$v$的子树内任意一个叶子上 $(2)$若$v$为叶子, 可以移动到距离$v$不超过$k$的祖先上 初始在结点$ ...
- codeforces 1053D 树形DP
题意:给一颗树,1为根节点,有两种节点,min或者max,min节点的值是它的子节点的值中最小的,max节点的值是它的子节点的值中最大的,若共有k个叶子,叶子的值依次为1~k. 问给每个叶子的值赋为几 ...
- Codeforces 1120D (树形DP 或 最小生成树)
题意看这篇博客:https://blog.csdn.net/dreaming__ldx/article/details/88418543 思路看这篇:https://blog.csdn.net/cor ...
- Codeforces 735E 树形DP
题意:给你一棵树,你需要在这棵树上选择一些点染成黑色,要求染色之后树中任意节点到离它最近的黑色节点的距离不超过m,问满足这种条件的染色方案有多少种? 思路:设dp[x][i]为以x为根的子树中,离x点 ...
随机推荐
- csv 文件介绍
CSV即Comma Separate Values,这种文件格式经常用来作为不同程序之间的数据交互的格式. 具体文件格式 每条记录占一行 以逗号为分隔符 逗号前后的空格会被忽略 字段中包含有逗号,该字 ...
- Android中LayoutInflater的使用
Inflater英文意思是膨胀,在Android中应该是扩展的意思吧. LayoutInflater 的作用类似于 findViewById(),不同点是LayoutInflater是用来找layou ...
- 函数fsp_try_extend_data_file
扩展表空间 /***********************************************************************//** Tries to extend t ...
- bzoj3955
首先,最短路不同的两辆车一定不会发生堵塞 对于最短路相同的点,我们把属于最短路径上的边拎出来建图跑最大流即可 然后我TLE了…… 因为很明显建出来图很大,而真正流的流量很小 普通的初始标号都是0的sa ...
- UVA 820 Internet Bandwidth 因特网宽带(无向图,最大流,常规)
题意:给一个无向图,每条边上都有容量的限制,要求求出给定起点和终点的最大流. 思路:每条无向边就得拆成2条,每条还得有反向边,所以共4条.源点汇点已经给出,所以不用建了.直接在图上跑最大流就可以了. ...
- 学习PHP C扩展之面向对象开发方式 (转)
PHP OOP面向对象之C语言开发方式 学习PHP C扩展有一段时间了,PHP手册里大部分讲的PHP的函数开发方式,网上找OOP资料比较少,想起上个月测试redis 的时候,下载PHP扩展redis源 ...
- live555学习之基本类介绍及计划任务深度探讨
liveMedia项目的源代码包括四个基本的库,各种测试代码以及Media Server.四个基本的库分别是: UsageEnvironment&TaskScheduler, groupsoc ...
- 【转】第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
原文网址:http://www.cnblogs.com/smyhvae/p/4456420.html [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.c ...
- SQL优化34条
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析 ...
- cgroup的测试数据
[root@xxxx /cgroup/memory/rule3021]#cat memory.limit_in_bytes503316480 480M [root@xxxx /cgroup/mem ...