[CF337D]邪恶古籍-树状dp
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的更多相关文章
- 树状DP (poj 2342)
题目:Anniversary party 题意:给出N各节点的快乐指数,以及父子关系,求最大快乐指数和(没人职员愿意跟直接上司一起玩): 思路:从底向上的树状DP: 第一种情况:第i个员工不参与,F[ ...
- poj3659树状DP
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6273 Accepted: 225 ...
- hdu 1561 The more, The Better_树状dp
题目链接 题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小. 思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+d ...
- poj 2342 Anniversary party_经典树状dp
题意:Ural大学有n个职员,1~N编号,他们有从属关系,就是说他们关系就像一棵树,父节点就是子节点的直接上司,每个职员有一个快乐指数,现在要开会,职员和职员的直接上司不能同时开会,问怎才能使开会的快 ...
- 树状DP HDU1520 Anniversary party
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:职员之间有上下级关系,每个职员有自己的happy值,越高在派对上就越能炒热气氛.但是必须是 ...
- [Codeforces743D][luogu CF743D]Chloe and pleasant prizes[树状DP入门][毒瘤数据]
这个题的数据真的很毒瘤,身为一个交了8遍的蒟蒻的呐喊(嘤嘤嘤) 个人认为作为一个树状DP的入门题十分合适,同时建议做完这个题之后再去做一下这个题 选课 同时在这里挂一个选取节点型树形DP的状态转移方程 ...
- 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 ...
- poj2486--Apple Tree(树状dp)
Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7789 Accepted: 2606 Descri ...
- 洛谷P2015 二叉苹果树(树状dp)
题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...
随机推荐
- css中那些容易被我们程序猿所忽略的选择器
css中那些容易被我们程序猿所忽略的选择器 作为一个程序猿,我们可能会遇到这样的问题,假如:有5个li,要求给第三个li设置背景颜色怎么办?有人会说,用JS啊,循环遍历出第三个不就行了.但是,用JS解 ...
- 使用SQL语句使数据从坚向排列转化成横向排列(排班表)
知识重点: 1.extract(day from schedule01::timestamp)=13 Extract 属于 SQL 的 DML(即数据库管理语言)函数,同样,InterBase 也支持 ...
- java基础(二章)
java基础(二章) 一,变量 1.变量是内存中的一个标识符号,用于存储数据 2.变量命名规则 l 必须以字母.下划线 _ .美元符号 $ 开头 l 变量中,可以包括数字 l 变量中,不能出现特 ...
- webpack实用配置
前面的话 上文介绍了webpack入门,本文将详细介绍webpack实用配置 版本号 以entry.js打包为bundle.js为例,出口的filename可以设置为[id].[name].[hash ...
- 在64位Ubuntu系统上安装32位程序包
在64位Ubuntu系统上安装32位的程序包 $sudo apt-get install package_name:i386 例如: $sudo apt-get install openjdk-7-j ...
- 前台ajax加载数据
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script> <script sr ...
- rem的js
html { font-size : 20px; } @media only screen and (min-width: 401px){ html { font-size: 25px !import ...
- Linux find运行机制详解
本文目录: 1.1 find基本用法示例 1.2 find理论部分 1.2.1 expression-operators 1.2.2 expression-options 1.2.3 expressi ...
- python 中 for 循环 if循环 break
python中最基本的语法格式大概就是缩进了.python中常用的循环:for循环,if循环.一个小游戏说明for,if ,break的用法. 猜数字游戏: 1.系统生成一个20以内的随机数 2.玩家 ...
- 学习mysql语法--基础篇(一)
前 言 mysql mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分: 一.创建用户,创建数据库,给 ...