题目

一棵树上有一个古籍,这个古籍可以影响到与它距离为 \(d\) 以内的点。现在给出被影响到的点,问古籍可能在多少个点上。

\(0\le m,d\le n\le 10^5\)。

分析

原问题不好做,把问题转化为求每个点距离最远的古籍的距离,最后统计有多少个符合要求的。

这是一个树形dp的经典问题,于是就在cf上WA了三次……

做法是分两次求出一个点距离子树中最远的点,以及子树外最远的点。

WA的原因是没有考虑好哪些点不存在下面和子树外的点,导致统计出现问题。以后这种题要把数组初始化为-1,每次转移都要判断一下。

代码

#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
using namespace std;
int read() {
int x=0,f=1;
char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=1e5+1;
bool spe[maxn];
vector<int> g[maxn];
inline void add(int x,int y) {g[x].push_back(y);}
inline void Max(int &x,int y) {x=max(x,y);}
int down[maxn],up[maxn];
void Down(int x,int fa) {
int &dw=down[x]=spe[x]?0:-1;
for (int v:g[x]) if (v!=fa) {
Down(v,x);
if (spe[v]) Max(dw,1);
if (~down[v]) Max(dw,down[v]+1);
}
}
void Up(int x,int fa) {
pair<int,int> fir(-1,0),sec(-1,0);
for (int v:g[x]) if (v!=fa) {
if (down[v]>fir.first) swap(fir,sec),fir=make_pair(down[v],v); else if (down[v]>sec.first) sec=make_pair(down[v],v);
}
for (int v:g[x]) if (v!=fa) {
int &uv=up[v]=-1;
if (v!=fir.second && ~fir.first) uv=fir.first+2; else if (~sec.first) uv=sec.first+2;
if (spe[x]) Max(uv,1);
if (~up[x]) Max(uv,up[x]+1);
Up(v,x);
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
int n=read(),m=read(),k=read();
for (int i=1;i<=m;++i) spe[read()]=true;
for (int i=1;i<n;++i) {
int x=read(),y=read();
add(x,y),add(y,x);
}
Down(1,1);
up[1]=-1;
Up(1,1);
int ans=0;
for (int i=1;i<=n;++i) ans+=(max(up[i],down[i])<=k);
printf("%d\n",ans);
return 0;
}

最新文章

  1. Java json串生成及转bean
  2. CSS Hack汇总快查(CSS兼容代码演示)
  3. React+Immutable.js的心路历程
  4. jquery 事件绑定(1)
  5. 微软Windows 7 “可启动U盘”制作工具及使用方法,非常的简单
  6. 运维之Linux基础(二)
  7. Java定时器应用
  8. C# MVC NPOI导出
  9. 微信web开发者工具 移动调试
  10. 运行pytorch代码遇到的error解决办法
  11. bzoj4556(sam)
  12. LightOJ - 1356 Prime Independence (二分图 最大独立集 素数打表)
  13. Centos 下安装VIM编辑器
  14. node之文件的静态资源的托管
  15. Kubernetes 存储系统 Storage 介绍
  16. OC Foundation框架—结构体
  17. oracle 一个网站
  18. 仿微信-ActionSheet
  19. Flask中使用mysql
  20. I/O设备

热门文章

  1. C语言复习20170821
  2. 20155330 实验一《Java开发环境的熟悉》(Windows+IDEA)实验报告
  3. 20145226夏艺华 《Java程序设计》第9周学习总结
  4. [BZOJ4444][SCOI2015]国旗计划-[ST表]
  5. spring 缓存机制
  6. python 的入门
  7. 教程:将应用迁移到 DirectX* 12 – 第 1 部分
  8. Struts2(一.基本介绍,环境搭建及需求分析)
  9. Tree Traversals Again(根据前序,中序,确定后序顺序)
  10. socket_tcp协议_loadrunner测试