香港记者跑的比谁都快是众所周知的常识。

现在,香港记者站在一颗有 n 个点的树的根结点上(即1号点),编号为 i 的点拥有权值 a[i] ,数据保证每个点的编号都小于它任意孩子结点的别号。

我们假定这棵树的每个叶子结点都在发生一个大新闻,香港记者要用最少的耗时去报道其中的任意一个。

若香港记者目前处于第 i 号点上,那么它可以移动至以 i 为根的子树上的任意一点 j ,耗时 a[i]+(j−i)p ,p为给定常数。

请问这位香港记者搞哪个大新闻的耗时最短?所耗时间是多少?

解题报告:

用时:3h,2WA4TLE

这题开始写没写出来,然后想着优化\(O(n^2)\)的暴力,于是开了个以\(val[x]+f[x]\)为判断条件的单调栈,然后还是TLE65

最后写的决策单调性:

对于一个点x,存在一个管辖的范围,在这个范围内x的转移是最优的,然后我们就维护这个东西,每次新加入一个点,我们拿这个点和栈顶的点分别和管辖的那个点计算然后作比较,维护单调性,然后每一次转移,我们二分到第一个能管辖到x的点就是最优转移,求一个点能管辖的范围,那么就二分一个\((x'-x)^p\)中的\(x'\),直到它刚好比栈顶元素优为止,其后就是它能管辖的范围

还有对于树上的栈维护,还要消除子树间的影响,我们进入一颗子树前,还要把在其他子树弹出的元素都放回栈中.

复杂度\(O(nlogn)\)

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=1e5+5;
typedef long long ll;
const ll inf=1e18;
int head[N],to[N<<1],n,nxt[N<<1],num=0,val[N],p;
void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
ll ans=inf,f[N],mul[N];
ll qm(ll x,ll k){
ll sum=1;
while(k){
if(k&1)sum*=x;
x*=x;k>>=1;
}
return sum;
}
bool vis[N];
struct node{
int x,last,fo;
node(){}
node(int _x,int _last,int _fo){x=_x;last=_last;fo=_fo;}
}q[N],st[N];
int top=0,stop=0,du[N];
void dfs(int x,int last){
int u;
if(x!=1){
int l=1,r=top,mid,ret=l,last;
while(l<=r){
mid=(l+r)>>1;
if(q[mid].last<=x)ret=mid,l=mid+1;
else r=mid-1;
}
f[x]=f[q[ret].x]+val[q[ret].x]+mul[x-q[ret].x];
while(top && q[top].last>=x){
u=q[top].x;last=q[top].last;
if(f[x]+val[x]+mul[last-x]<=f[u]+val[u]+mul[last-u])
st[++stop]=q[top--],st[stop].fo=x;
else break;
}
l=Max(q[top].last+1,x+1);r=n;ret=0;u=q[top].x;
while(l<=r){
mid=(l+r)>>1;
if(f[x]+val[x]+mul[mid-x]<=f[u]+val[u]+mul[mid-u])
ret=mid,r=mid-1;
else l=mid+1;
}
if(ret)q[++top]=node(x,ret,0);
}
else f[x]=0,q[++top]=node(1,1,0);
if(!du[x])ans=Min(ans,f[x]);
for(int i=head[x];i;i=nxt[i]){
u=to[i];if(u==last)continue;
dfs(u,x);
}
if(q[top].x==x)top--;
while(stop && st[stop].fo==x)q[++top]=st[stop--];
}
void work()
{
int x;
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++){
scanf("%d%d",&val[i],&x);
if(x)link(x,i),link(i,x),du[x]++;
}
for(int i=0;i<=n;i++){
mul[i]=qm(i,p);
if(mul[i]>=inf){
for(int j=i;j<=n;j++)
mul[j]=inf;
break;
}
}
dfs(1,1);
printf("%lld\n",ans);
} int main()
{
work();
return 0;
}

51Nod 1781 跑的比谁都快的更多相关文章

  1. 跑的比谁都快 51Nod - 1789

    香港记者跑的比谁都快是众所周知的常识.   现在,香港记者站在一颗有  nn 个点的树的根结点上(即1号点),编号为  ii 的点拥有权值  a[i]a[i] ,数据保证每个点的编号都小于它任意孩子结 ...

  2. BZOJ:4219: 跑得比谁都快 3007: 拯救小云公主

    4219: 跑得比谁都快 3007: 拯救小云公主 三角剖分的解释可以看这里:http://www.cnblogs.com/Enceladus/p/6706444.html 后一道是前一道的弱化版. ...

  3. [51nod1789] 跑得比谁都快

    题面 题解 设\(f[i]\)为根节点到\(i\)的最小耗时 设\(S\)为\(i\)的祖先集合, 可以得到 \[ f[i] = min(f[j] + (i - j)^p),j \in S \] 对于 ...

  4. iOS 1 到 iOS 10 ,我都快老了

    iOS 1:iPhone诞生 虽然很难想像,但初代iPhone在问世时在功能方面其实远远落后于那时的竞争对手,比如Windows Mobile.Palm OS.塞班.甚至是黑莓.它不支持3G.多任务. ...

  5. jdk1.8新特性,还不知道的朋友还不看看,1.9都快出来了

    一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:代码如下:interface Formula {     ...

  6. 入坑IT都快十年了

    一起帮的开发直播已经告一段落:一是主体的功能差不多都实现了,二是用到的架构技术都展示得差不多了.以后就算继续开发,也应该都是一些“技术上”重复的工作而已.整个直播过程耗时近半年,SVN提交1062次, ...

  7. 今天我看了一个H5游戏EUI的例子,我都快分不清我到底是在用什么语言编译了代码了,作为刚刚学习H5游戏开发的菜鸟只能默默的收集知识

    今天看了一个EUI的demo,也是接触H5游戏开发的第五天了,我想看看我能不能做点什么出来,哎,自己写果然还是有问题的.在看EUI哪一个demo的时候就遇见了一些摇摆不定的问题,我觉得提出来 1.to ...

  8. Java9都快发布了,Java8的十大新特性你了解多少呢?

    Java 9预计将于今年9月份发布,这是否会是一次里程碑式的版本,我们拭目以待.今天,我们先来复习一下2014年发布的Java 8的十大新特性. Java 8可谓是自Java 5以来最具革命性的版本了 ...

  9. 51nod 1781 Pinball(线段树)

    题面 Pinball的游戏界面由m+2行.n列组成.第一行在顶端.一个球会从第一行的某一列出发,开始垂直下落,界面上有一些漏斗,一共有m个漏斗分别放在第2~m+1行,第i个漏斗的作用是把经过第i+1行 ...

随机推荐

  1. *.db-journal 是什么(android sqlite )数据库删除缓存

    sqlite的官方文档,发现该文件是sqlite的一个临时的日志文件,主要用于sqlite数据库的事务回滚操作了.在事务开始时产生,在事务操作完毕时自动删除,当程序发生崩溃或一些意外情况让程序非法结束 ...

  2. linux 下 nc 命令的使用

    netcat被誉为网络安全界的'瑞士军刀',一个简单而有用的工具,透过使用TCP或UDP协议的网络连接去读写数据.它被设计成一个稳定的后门工具,能够直接由其它程序和脚本轻松驱动.同时,它也是一个功能强 ...

  3. day-5 python协程与I/O编程深入浅出

    基于python编程语言环境,重新学习了一遍操作系统IO编程基本知识,同时也学习了什么是协程,通过实际编程,了解进程+协程的优势. 一.python协程编程实现 1.  什么是协程(以下内容来自维基百 ...

  4. vue下拉列表

    最近在弄作品,做了个下拉列表.心想各位小哥哥.小姐姐可能会用到相同的需求,就把下拉列表封装一下,希望能对各位小哥哥,小姐姐有帮助 github地址:https://github.com/ClmPisc ...

  5. PHP分页初探 一个最简单的PHP分页代码的简单实现

    PHP分页代码在各种程序开发中都是必须要用到的,在网站开发中更是必选的一项. 要想写出分页代码,首先你要理解SQL查询语句:select * from goods limit 2,7.PHP分页代码核 ...

  6. salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

    注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...

  7. 新概念英语(1-137)A pleasant dream

    Lesson 137 A pleasant dream 美好的梦 Listen to the tape then answer this question. What would Julie like ...

  8. Nginx负载均衡(架构之路)

    [前言] 在大型网站中,负载均衡是有想当必要的.尤其是在同一时间访问量比较大的大型网站,例如网上商城,新闻等CMS系统,为了减轻单个服务器的处理压力,我们引进了负载均衡这一个概念,将一个服务器的压力分 ...

  9. jedis配置

    public interface IJedisClientFactory { Jedis getJedis(); } JedisClientFactoryImpl.java @Service publ ...

  10. java循环遍历类属性 get 和set值方法

    //遍历sqspb类 成员为String类型 属性为空的全部替换为"/"Field[] fields = sqspb.getClass().getDeclaredFields(); ...