跑的比谁都快 51Nod - 1789
香港记者跑的比谁都快是众所周知的常识。
Input第一行两个数n<=100000、p<=10,代表树上点的个数以及题中所提及的常数p。
接下来n行,第i行有两个数字aii<10^6、faii <i,分别代表i号点的权值与i号点的父亲节点编号(根节点父亲编号为0)。
数据保证最短耗时不超过10^18.Output每组数据输出一行为最短耗时。Sample Input
10 2
833 0
2076 1
5759 1
5671 3
6642 2
3712 4
8737 1
5139 6
8800 1
6638 1
Sample Output
849 先谢谢Jessie Liu大佬的点拨。
题解:
这个题目,我们先考虑一条链的情况,设dp[i]表示i这个节点到1节点的最小花费,那么dp[i]=dp[j]+cost[j~i],这个是十分显然的,所以在链上枚举i的每个前驱节点就可以。
换成一棵树,因为一棵树是由很多条链来组成的,对于节点i,我们可以枚举每个祖先来j来dp,状态转移是一样的,但是具体怎么在树上枚举祖先呢?可以开一个栈记录一下所经过的深度的节点就看了。
因为是指数函数,可以看出有决策单调性,那么就记一下父节点是从哪里转移的,从那里开始枚举就可以了。 代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define MAXN 100100
#define ll long long
using namespace std;
struct edge{
int first;
int next;
int to;
}a[MAXN*];
ll dp[MAXN],node[MAXN],fa[MAXN],stk[MAXN],last[MAXN],ans=1ll<<;
int n,p,num=; void addedge(int from,int to){
a[++num].to=to;
a[num].next=a[from].first;
a[from].first=num;
} ll pw(ll base,int h){
ll ans=;
while(h){
if(h&) ans=ans*base;
base*=base;h>>=;
}
return ans;
} void dfs(int now,int dep){
stk[dep]=now;
for(int j=last[fa[now]];j<dep;j++){
ll cnt=dp[stk[j]]+node[stk[j]]+pw(now-stk[j],p);
if(dp[now]>cnt) dp[now]=cnt,last[now]=j;
}
int sz=;
for(int i=a[now].first;i;i=a[i].next){
int to=a[i].to;
if(to==fa[now]) continue;
sz++;
dfs(to,dep+);
}
if(!sz) ans=min(ans,dp[now]);
} int main()
{
scanf("%d%d",&n,&p);
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++){
scanf("%lld%lld",&node[i],&fa[i]);
addedge(i,fa[i]),addedge(fa[i],i);
}
dp[]=;
dfs(,);
printf("%lld",ans);
return ;
}
跑的比谁都快 51Nod - 1789的更多相关文章
- 51Nod 1781 跑的比谁都快
香港记者跑的比谁都快是众所周知的常识. 现在,香港记者站在一颗有 n 个点的树的根结点上(即1号点),编号为 i 的点拥有权值 a[i] ,数据保证每个点的编号都小于它任意孩子结点的别号. 我们假定这 ...
- BZOJ:4219: 跑得比谁都快 3007: 拯救小云公主
4219: 跑得比谁都快 3007: 拯救小云公主 三角剖分的解释可以看这里:http://www.cnblogs.com/Enceladus/p/6706444.html 后一道是前一道的弱化版. ...
- [51nod1789] 跑得比谁都快
题面 题解 设\(f[i]\)为根节点到\(i\)的最小耗时 设\(S\)为\(i\)的祖先集合, 可以得到 \[ f[i] = min(f[j] + (i - j)^p),j \in S \] 对于 ...
- iOS 1 到 iOS 10 ,我都快老了
iOS 1:iPhone诞生 虽然很难想像,但初代iPhone在问世时在功能方面其实远远落后于那时的竞争对手,比如Windows Mobile.Palm OS.塞班.甚至是黑莓.它不支持3G.多任务. ...
- jdk1.8新特性,还不知道的朋友还不看看,1.9都快出来了
一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:代码如下:interface Formula { ...
- 入坑IT都快十年了
一起帮的开发直播已经告一段落:一是主体的功能差不多都实现了,二是用到的架构技术都展示得差不多了.以后就算继续开发,也应该都是一些“技术上”重复的工作而已.整个直播过程耗时近半年,SVN提交1062次, ...
- 今天我看了一个H5游戏EUI的例子,我都快分不清我到底是在用什么语言编译了代码了,作为刚刚学习H5游戏开发的菜鸟只能默默的收集知识
今天看了一个EUI的demo,也是接触H5游戏开发的第五天了,我想看看我能不能做点什么出来,哎,自己写果然还是有问题的.在看EUI哪一个demo的时候就遇见了一些摇摆不定的问题,我觉得提出来 1.to ...
- Java9都快发布了,Java8的十大新特性你了解多少呢?
Java 9预计将于今年9月份发布,这是否会是一次里程碑式的版本,我们拭目以待.今天,我们先来复习一下2014年发布的Java 8的十大新特性. Java 8可谓是自Java 5以来最具革命性的版本了 ...
- "迷途"的野指针,都快找不着北了
指针,C语言开发者表示很淦,指针的使用,很多人表示不敢直面ta,不像Java一样,有垃圾自动回收功能,我们不用担心那么多内存泄漏等问题,那C语言里边呢,指针又分为了"野指针",&q ...
随机推荐
- 关于重写对象equals方法的问题
1.==和equals的区别 a.基本数据类型使用 == 进行值的比较 b.引用类型使用 == 进行比较时,直接比较的是对象的存储地址,即两个引用是否指向了同一个对象. c.equals方法是基类O ...
- springboot中动态修改log4j2日志级别
springboot中动态修改log4j2日志级别 在spring boot中使用log4j2日志时,项目运行中,想要修改日志级别. 1.pom.xml依赖: <dependency> & ...
- 粗糙版ORM(附详细注释)
目录 ORM 其他 ORM代码 数据库表代码 mysql代码 db/models.py db/pymysql_opreator.py ORM 作为数据库表记录 和 python中对象的映射关系中间件 ...
- 解决android splash 启动白屏问题
有时我们会发现 ,在splash 页面启动之前会有那么零点几秒的白屏, 真的很让人抓狂 解决办法其实也很简单 . 1.在style.xml中定义一个样式, 这里引入 splash页面的 图片, 注意不 ...
- MySQL实现Oracle rank()排序
一.Oracle写法介绍 MySQL5.7版本没有提供类似Oracle的分析函数,比如开窗函数over(...),oracle开窗函数over(...)使用的话一般是和order.partition ...
- 自定义JDBC工具类
因为数据库的连接代码都是固定的,为了将减少重复的代码的书写,可以将这些代码封装为一个工具类,获取数据库的连接对象. import java.sql.Connection; import java.sq ...
- JQuery学习笔记之手网琴效果
这种东西在网上多的是,最近在学JQuery,所以就写了个随笔 <!DOCTYPE html> <html lang="en"> <head> & ...
- asp.net core mvc 之 DynamicApi
这段时间闲赋在家,感觉手痒,故想折腾一些东西. 由于之前移植了一个c#版本的spring cloud feign客户端(https://github.com/daixinkai/feign.net), ...
- npm install 时间很长解决方案
国外镜像站很慢,所以我们可以更换为国内的镜像站 首先可以get命令查看registry npm congfig get registry 如果你没有变更果regustry你的结果应该会是这样的 也就是 ...
- Kerberoasting攻击
前面我们介绍了<Windows本地认证>.<Windows网络认证>.<Windows域认证>和<SPN扫描>,这次继续讲解域内相关的东西. 0x01介 ...