Problem 邪恶古籍

题目大意

给出一些关键点,求这棵树上到最远关键点距离小于等于d的有多少个。

Solution

一个非常简单的树形dp。然而我被这道题给玩坏了。

在经过分析以后,我们发现只需要维护两个数组,

一个数组记录这个点的上面的最远关键点(父亲那一串)到这个点的距离;

另一个数组记录这个点的子树上的最远关键点到这个点的距离。

这个应该是正解,其实也和我的做法差不多,但是较好理解。

我的垃圾做法如下:

对于每一个节点,开三个值,path,pathp,pathn。

path表示其子树上最远关键点到这个点的距离,

pathp表示其子树上次远关键点到这个点的距离,且与最远关键点不在同一颗子树上。

pathn表示其最远关键点所在的子树。

首先第一次dfs可以求出来这三个值。

然后再一次dfs,这次dfs的时候,path就变成了全树上最远关键点到这个点的距离,也就是我们最终要求的答案。

从根节点开始扫,若父亲的pathn指的不是这个点,那么这个点的path值就变成了父亲的path值+1;

如果父亲的pathn指的就是这个点,那么我们的pathp就起了作用。若pathp的值小于这个点的path值,那么就更新path值。

当然在这个dfs的过程中,也要保证维护pathp的存在。

然后为了写这玩意儿我拉低了整题的AC率,所以强烈不推荐这个奇奇怪怪的方法。

而且我还不知道是不是正解,鬼知道cf的数据强不强。所以如果有错误的话请各位指出。

反正oj上我是A掉了。

那么,最后祝各位写题愉快。

反正这题我写的是很无语的。

AC Code

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node{
int next,to;
}e[];
bool neko[];
int n,m,d,x,u,v,path[],h[],ans=,tot=;
int pathp[],pathn[];
void add(int u,int v){
e[++tot].to=u;e[tot].next=h[v];h[v]=tot;
e[++tot].to=v;e[tot].next=h[u];h[u]=tot;
}
void dfspath(int x,int last){
path[x]=-;pathp[x]=-;
for(int i=h[x];~i;i=e[i].next){
if(e[i].to!=last){
dfspath(e[i].to,x);
if(path[x]<path[e[i].to]+){
pathp[x]=path[x];
path[x]=path[e[i].to]+;
pathn[x]=e[i].to;
}else if(pathp[x]<path[e[i].to]+)pathp[x]=path[e[i].to]+;
}
}
if(neko[x]&&path[x]<-)path[x]=;
if(neko[x]&&pathp[x]<-)pathp[x]=;
}
void dpdfs(int x,int last){
if(~last)
if(pathn[last]==x){
if(pathp[last]+>path[x]){
pathp[x]=path[x];
path[x]=pathp[last]+;
pathn[x]=;
}else if(pathp[last]+>pathp[x])pathp[x]=pathp[last]+;
}else{
if(path[last]+>path[x]){
pathp[x]=path[x];
path[x]=path[last]+;
pathn[x]=;
}else if(path[last]+>pathp[x])
pathp[x]=path[last]+;
}
if(path[x]<=d)ans++;
for(int i=h[x];~i;i=e[i].next)
if(e[i].to!=last)dpdfs(e[i].to,x);
}
int main(){
// freopen("cf337d.in","r",stdin);
memset(h,-,sizeof(h));
scanf("%d%d%d",&n,&m,&d);
for(int i=;i<=m;i++)
scanf("%d",&x),neko[x]=;
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);
}
dfspath(,);
dpdfs(,-);
printf("%d",ans);
}

[CF337D]邪恶古籍-树状dp的更多相关文章

  1. 树状DP (poj 2342)

    题目:Anniversary party 题意:给出N各节点的快乐指数,以及父子关系,求最大快乐指数和(没人职员愿意跟直接上司一起玩): 思路:从底向上的树状DP: 第一种情况:第i个员工不参与,F[ ...

  2. poj3659树状DP

    Cell Phone Network Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6273   Accepted: 225 ...

  3. hdu 1561 The more, The Better_树状dp

    题目链接 题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小. 思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+d ...

  4. poj 2342 Anniversary party_经典树状dp

    题意:Ural大学有n个职员,1~N编号,他们有从属关系,就是说他们关系就像一棵树,父节点就是子节点的直接上司,每个职员有一个快乐指数,现在要开会,职员和职员的直接上司不能同时开会,问怎才能使开会的快 ...

  5. 树状DP HDU1520 Anniversary party

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:职员之间有上下级关系,每个职员有自己的happy值,越高在派对上就越能炒热气氛.但是必须是 ...

  6. [Codeforces743D][luogu CF743D]Chloe and pleasant prizes[树状DP入门][毒瘤数据]

    这个题的数据真的很毒瘤,身为一个交了8遍的蒟蒻的呐喊(嘤嘤嘤) 个人认为作为一个树状DP的入门题十分合适,同时建议做完这个题之后再去做一下这个题 选课 同时在这里挂一个选取节点型树形DP的状态转移方程 ...

  7. HDU 4714 Tree2cycle(树状DP)(2013 ACM/ICPC Asia Regional Online ―― Warmup)

    Description A tree with N nodes and N-1 edges is given. To connect or disconnect one edge, we need 1 ...

  8. poj2486--Apple Tree(树状dp)

    Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7789   Accepted: 2606 Descri ...

  9. 洛谷P2015 二叉苹果树(树状dp)

    题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...

随机推荐

  1. spark 2.1.0 集群安装

    jdk安装 http://www.cnblogs.com/xiaojf/p/6568426.html scala2.11 安装 http://www.cnblogs.com/xiaojf/p/6568 ...

  2. web工作过程

    了解浏览器与服务器进行通信和访问的过程 打开浏览器-输入URL地址 当我们访问一个网页时,如http://www.baidu.com,这个网址包含四个部分的内容: 1.第一部分:协议类型:这里是htt ...

  3. sql还原(.bak文件还原)

    第一步: 右键“数据库”,选择“还原数据库” 第二步: 选择“设备”,然后选择“…” 第三步: 添加备份文件(这里使用MyDB.bak) 第四步: 勾选“还原”复选框,进度显示“已完成” 第五步: 最 ...

  4. 堆结构的优秀实现类----PriorityQueue优先队列

    之前的文章中,我们有介绍过动态数组ArrayList,双向队列LinkedList,键值对集合HashMap,树集TreeMap.他们都各自有各自的优点,ArrayList动态扩容,数组实现查询非常快 ...

  5. MySql的学习笔记

    良好的理解sql语句: 列:理解可以运算的成变量 where: 理解成表达式,放在行中看是否成立 查出来的结果可以当成一张表理解,select 套用select综合查询:   五种查询 where g ...

  6. Nodejs-express 4.0框架 简单介绍

    http://www.expressjs.com.cn/4x/api.html  这个是express API的中文手册 但是只是翻译了一点 英语比较差比较难受. 1. 关于安装 现在网上查的时候有一 ...

  7. redis五种数据类型

    string Redis的字符串和其他编程语言或者其他键值存储提供的字符串非常相似. 命令 行为 GET 获取存储在给定键中的值 SET 设置存储在给定键中的值 DEL 删除存储在给定中的值(这个命令 ...

  8. Python学习:基本概念

    Python学习:基本概念 一,python的特点: 1,python应用场景多;爬虫,网站,数据挖掘,可视化演示. 2,python运行速度慢,但如果CPU够强,这差距并不明显. 3,严格的缩进式编 ...

  9. thinkphp5.0学习笔记(二)

    本文为公司制作API接口后台的小结! 1.命名注意事项: 不要使用易混淆的名字,如index,index01... 我喜欢用拼音... 比如: public function zhuce(Reques ...

  10. [1] Entity Framework / Code First

    CodeFirst是EntityFramework的一种技术手段,因为传统编程方式都是先建立数据库,然后根据数据库模型为应用程序建模,再进行开发:CodeFirst从字面上理解就是代码先行,先在程序中 ...