来自FallDream 的博客,未经允许,请勿转载,谢谢。


今年夏天,NOI在SZ市迎来了她30周岁的生日。来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会。

       全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接。为了方便起见,我们将全国的 n 个城市用 1 到 n 的整数编号。其中SZ市的编号为 1。对于除SZ市之外的任意一个城市 v,我们给出了它在这棵树上的父亲城市 fv  以及到父亲城市道路的长度 sv。
从城市 v 前往SZ市的方法为:选择城市 v 的一个祖先 a,支付购票的费用,乘坐交通工具到达 a。再选择城市 a 的一个祖先 b,支付费用并到达 b。以此类推,直至到达SZ市。
对于任意一个城市 v,我们会给出一个交通工具的距离限制 lv。对于城市 v 的祖先 a,只有当它们之间所有道路的总长度不超过 lv  时,从城市 v 才可以通过一次购票到达城市 a,否则不能通过一次购票到达。对于每个城市 v,我们还会给出两个非负整数 pv,qv  作为票价参数。若城市 v 到城市 a 所有道路的总长度为 d,那么从城市 v 到城市 a 购买的票价为 dpv+qv。
每个城市的OIer都希望自己到达SZ市时,用于购票的总资金最少。你的任务就是,告诉每个城市的OIer他们所花的最少资金是多少。
n<=2*10^5

dp式子比较容易列出来 f[i]=min f[j]+q[i]+p[i]*(d[i]-d[j)

考虑斜率优化,发现j比k优,当且仅当p<(f[j]-f[k])/(d[j]-d[k]) 所以考虑维护凸包

可以直接线段树+无旋treap 大力维护凸包

也可以cdq分治上树,每次像点分治那样做,然后用包含根的那个子树更新其它子树。

更新时候按照深度(用于更新的点直接放深度,否则放深度减去limit)排序从下往上做

复杂度nlogn^2

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define ll long long
  6. #define MN 200000
  7. #define INF 2000000000
  8. using namespace std;
  9. inline ll read()
  10. {
  11. ll x = , f = ; char ch = getchar();
  12. while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
  13. while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
  14. return x * f;
  15. }
  16.  
  17. ll q[MN+],p[MN+],l[MN+],dep[MN+],f[MN+];
  18. int n,head[MN+],cnt=,top,size[MN+],b[MN+],fa[MN+],mx[MN+],Mx[MN+];
  19. struct edge{int to,next;ll w;}e[MN*+];
  20. inline double Getslop(int x,int y){return !y?-INF:(double)(f[y]-f[x])/(dep[y]-dep[x]);}
  21. struct data{int x,kind;ll dep;}a[MN+];
  22. struct CH
  23. {
  24. int s[MN+],tp;
  25. void clear() {tp=;}
  26. void ins(int x)
  27. {
  28. while(tp>&&Getslop(s[tp],s[tp-])<Getslop(x,s[tp])) --tp;
  29. s[++tp]=x;
  30. }
  31. int query(ll p)
  32. {
  33. int l=,r=tp,mid,ans;s[tp+]=;
  34. while(l<=r)
  35. {
  36. mid=l+r>>;
  37. if(Getslop(s[mid],s[mid+])<(double)p) ans=mid,r=mid-;
  38. else l=mid+;
  39. }
  40. return s[ans];
  41. }
  42. }H;
  43. inline void ins(int f,int t,ll w){e[++cnt]=(edge){t,head[f],w};head[f]=cnt;}
  44.  
  45. void Pre(int x)
  46. {
  47. size[x]=;mx[x]=;
  48. for(int i=head[x];i;i=e[i].next)
  49. dep[e[i].to]=dep[x]+e[i].w,Pre(e[i].to),size[x]+=size[e[i].to],mx[x]=max(mx[x],size[e[i].to]);
  50. }
  51.  
  52. void GetRt(int x,int tot,int &rt)
  53. {
  54. size[x]=;mx[x]=;
  55. for(int i=head[x];i;i=e[i].next)
  56. if(!b[e[i].to]) GetRt(e[i].to,tot,rt),size[x]+=size[e[i].to],mx[x]=max(mx[x],size[e[i].to]);
  57. Mx[x]=max(mx[x],tot-size[x]);
  58. if(size[x]>&&Mx[x]<Mx[rt]) rt=x;
  59. }
  60.  
  61. void Dfs(int x)
  62. {
  63. a[++top]=(data){x,,dep[x]-l[x]};
  64. for(int i=head[x];i;i=e[i].next)
  65. if(!b[e[i].to]) Dfs(e[i].to);
  66. }
  67. bool cmp(data x,data y){return x.dep==y.dep?x.kind>y.kind:x.dep>y.dep;}
  68. ll GetAns(int x,int y){return f[y]+p[x]*(dep[x]-dep[y])+q[x];}
  69. void Solve(int x,int Sz)
  70. {
  71. if(Sz<=) return;int rt=;
  72. GetRt(x,Sz,rt);
  73. for(int i=head[rt];i;i=e[i].next) b[e[i].to]=;
  74. Solve(x,Sz-size[rt]+);
  75. a[top=]=(data){rt,,dep[rt]};
  76. for(int t=fa[rt];t!=fa[x];t=fa[t]) a[++top]=(data){t,,dep[t]};
  77. for(int i=head[rt];i;i=e[i].next) Dfs(e[i].to);
  78. sort(a+,a+top+,cmp);H.clear();
  79. for(int i=;i<=top;++i)
  80. if(a[i].kind) H.ins(a[i].x);
  81. else if(H.tp) f[a[i].x]=min(f[a[i].x],GetAns(a[i].x,H.query(p[a[i].x])));
  82. for(int i=head[rt];i;i=e[i].next) Solve(e[i].to,size[e[i].to]);
  83. }
  84.  
  85. int main()
  86. {
  87. n=read();read();
  88. memset(f,,sizeof(f));
  89. for(int i=;i<=n;++i)
  90. {
  91. fa[i]=read();ll w=read();
  92. p[i]=read(),q[i]=read();l[i]=read();
  93. ins(fa[i],i,w);
  94. }
  95. Pre();f[]=;Mx[]=INF;Solve(,size[]);
  96. for(int i=;i<=n;++i) printf("%lld\n",f[i]);
  97. return ;
  98. }

[Noi2014]购票的更多相关文章

  1. [BZOJ3672][UOJ#7][NOI2014]购票

    [BZOJ3672][UOJ#7][NOI2014]购票 试题描述  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.       ...

  2. bzoj 3672: [Noi2014]购票 树链剖分+维护凸包

    3672: [Noi2014]购票 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 480  Solved: 212[Submit][Status][D ...

  3. BZOJ 3672: [Noi2014]购票( 树链剖分 + 线段树 + 凸包 )

    s弄成前缀和(到根), dp(i) = min(dp(j) + (s(i)-s(j))*p(i)+q(i)). 链的情况大家都会做...就是用栈维护个下凸包, 插入时暴力弹栈, 查询时就在凸包上二分/ ...

  4. bzoj千题计划251:bzoj3672: [Noi2014]购票

    http://www.lydsy.com/JudgeOnline/problem.php?id=3672 法一:线段树维护可持久化单调队列维护凸包 斜率优化DP 设dp[i] 表示i号点到根节点的最少 ...

  5. [BZOJ3672][Noi2014]购票 斜率优化+点分治+cdq分治

    3672: [Noi2014]购票 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1749  Solved: 885[Submit][Status][ ...

  6. [NOI2014]购票 --- 斜率优化 + 树形DP + 数据结构

    [NOI2014]购票 题目描述 今年夏天,NOI在SZ市迎来了她30周岁的生日. 来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每 ...

  7. 【BZOJ 3672】 3672: [Noi2014]购票 (CDQ分治+点分治+斜率优化)**

    3672: [Noi2014]购票 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.        全国 ...

  8. 【BZOJ3672】[Noi2014]购票 树分治+斜率优化

    [BZOJ3672][Noi2014]购票 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.       ...

  9. BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化

    BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ...

  10. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

随机推荐

  1. HTTP协议以及HTTP2.0/1.1/1.0区别

    HTTP协议以及HTTP2.0/1.1/1.0区别 一.简介 摘自百度百科: 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所 ...

  2. python 面向对象设计思想发展史

    这篇主要说的是程序设计思想发展历史,分为概述和详细发展历史 一,概述 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的 指令和数 据.简单来 ...

  3. postcss的安装与使用

    我是经过公司另外一个同事推荐的这个 他是一个资深的大哥哥  我觉得我确实需要跟多的学习和成长 而且我觉得我应该听他的话 多学学新知识 最近一直在做适配的网站 会出现很多媒体查询 我发现用这个写媒体查询 ...

  4. 偶遇vue-awesome-swiper的坑

    最近用vue重构一个移动端的项目,碰到了不少坑,今天拿移动端最著名的轮播插件swiper为例来说,由于这个项目没用UI库,纯手写的样式,沿用老的插件,自然而然的选择了vue-awesome-swipe ...

  5. auto_prepend_file与auto_append_file使用方法

    auto_prepend_file与auto_append_file使用方法 如果需要将文件require到所有页面的顶部与底部. 第一种方法:在所有页面的顶部与底部都加入require语句. 例如: ...

  6. PHP之this和self

    self在对象中自己调用自己使用 $this在实例化后使用$this方法 在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就 ...

  7. unity3D 知识点随手记

    最近闲来无事,记记unity3D相关的一些知识点吧,也当作笔记存储.转载请标明出处:http://www.cnblogs.com/zblade/ 1.unity是如何调用Start/Awake等相关函 ...

  8. zuul入门(4)zuul的注解@EnableZuulServer和@EnableZuulProxy

    @EnableZuulServer.@EnableZuulProxy两个注解 @EnableZuulProxy简单理解为@EnableZuulServer的增强版,当Zuul与Eureka.Ribbo ...

  9. apigw鉴权分析(1-3)百度 AI - 鉴权方式分析

    http://ai.baidu.com/docs#/Begin/top 一.访问入口 二.鉴权方式分析 1.鉴权认证方式一 - access_token - 针对HTTP API调用者 2.鉴权认证方 ...

  10. 粒子系统(二):Canvas绘制精美图案

    准备 IDE:Visual Studio Code Language:JavaScript / ECMAScript 6+ GitHub:Natural2D.JS 本文主要讲述 Particles - ...