[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. 我们用一根树枝两端连接的结点的编号来 ...
随机推荐
- 在eclipse-jee-juno中配置Aptana对jQuery代码自动提示
主要问题 在Aptana的Web Project中打开js文件有JavaScript的自动提示,但是在JavaEE项目中却没有. 版本 eclipse-jee-juno,即Eclipse 4.2的Ja ...
- jmeter跨线程组传值
在测试过程中,有时候需要jmeter跨线程组传值,jmeter本身又不具备此功能,那么,又该如何实现呢? 其实,我们可以通过BeanShell去实现. 实现过程如下: 1.线程组A中,使用正则表达式提 ...
- 简单bmp图片处理工具——python实现
预备实现功能: 1.读取bmp文件 2.保存bmp文件 3.对bmp图片进行放大.缩小 4.对bmp图片进行灰度化 5.对bmp图片进行旋转 bmp文件格式非常简单,对于我这种初学者来说减少了不少不必 ...
- Libevent源码分析—event, event_base
event和event_base是libevent的两个核心结构体,分别是反应堆模式中的Event和Reactor.源码分别位于event.h和event-internal.h中 1.event: s ...
- [C++][OpenGL]自己写GUI(0)——介绍
文章可转载,转载请注明出处:http://www.cnblogs.com/collectionne/p/6928612.html.文章未完,如果不在博客园(cnblogs)发现本文,请访问前面的链接查 ...
- 移动端使用rem同时适应安卓ios手机原理解析,移动端响应式开发
rem单位大家可能已经很熟悉,rem是随着html的字体大小来显示代表宽度的方法,我们怎样进行移动端响应式开发呢 浏览器默认的字体大小为16px 及1rem 等于 16px 如果我们想要使1rem等于 ...
- 网络编程应用:基于UDP协议【实现文件下载】--练习
要求: 基于UDP协议实现文件下载 发送方–请求–接收方发送文件–发送方接收文件 代码: 发送方: package Homework1; import java.io.File; import jav ...
- Java IO流之转换流
一.转换流 1.在IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换流 2.转换流用于在字节流和字符流之间转换 3.转换流本身是字符流 二.两种转换流 Ou ...
- 是时候开始用C#快速开发移动应用了
从2015年接触Xamarin到至今已经2个年头,我对Xamarin的技能没有长进多少,但它却已经足够成熟到在跨平台移动开发工具中占有一席之地.在扫了一些资料之后,突然发现国外有很多移动端的应用已经是 ...
- Android上解析Json格式数据
package com.practice.json; import org.json.JSONArray; import org.json.JSONException; import org.json ...