题目描述

   今年夏天,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他们所花的最少资金是多少。

输入格式

  第 1 行包含2个非负整数 n,t,分别表示城市的个数和数据类型(其意义将在后面提到)。输入文件的第 2 到 n 行,每行描述一个除SZ之外的城市。其中第 v 行包含 5 个非负整数 $f_v,s_v,p_v,q_v,l_v$,分别表示城市 v 的父亲城市,它到父亲城市道路的长度,票价的两个参数和距离限制。请注意:输入不包含编号为 1 的SZ市,第 2 行到第 n 行分别描述的是城市 2 到城市 n。


输出格式

  输出包含 n-1 行,每行包含一个整数。其中第 v 行表示从城市 v+1 出发,到达SZ市最少的购票费用。同样请注意:输出不包含编号为 1 的SZ市。


数据规模


  • 题解:

    • 设$v$是$u$的祖先,$dp[u] = dp[v] + (dis[u]-dis[v])*p[u] + q[u] \  , \  (dis[u]-dis[v]<=l[u])$
    • 斜率优化部分:
    • 假设$d[v_{1}]<d[v_{2}]$且对$u$来说$v2$比$v1$更优:
    • $$dp[v_{1}]+(dis[u]-dis[v_{1}])*p[u]+q[u] > dp[v_{2}]+(dis[u]-dis[v_{2}])*p[u]+q[u] ;$$
    • $$\frac{dp[v_{2}]-dp[v_{1}]}{dis[v2]-dis[v1]} < p[u]$$
    • 可以维护$(dis[v],dp[v])$的下凸包(斜率单调上升);
    • 由于是在一颗树上且有$l$的限制,所以我们需要用用一些方法维护一下,
    • 可以找树的重心分治,我写的树剖:
    • 对每个重链的顶端维护一个凸包,$dfs$的时候不断加入点;
    • 我们先$dfs$轻儿子,这样一个点到根的轻链的父亲都是一个凸包的末端;
    • 找转移点的时候不断向上跳,如果某条链全部满足限制则在重链顶端的凸包上直接查询;
    • 否则一定是合法的分界点在当前找到的链上,用线段树维护区间的凸包查询即可;
    • 一次最多找到$log$条树链,最多有一条树链需要在线段树里面查询;
    • 算上三分,时间复杂度:$O(nlog^2n)$
    • 有个小技巧,线段树满了之后再做凸包
  1. #include<bits/stdc++.h>
  2. #define ls (k<<1)
  3. #define rs (k<<1|1)
  4. #define ll long long
  5. #define ld double
  6. using namespace std;
  7. const int N=;
  8. char gc(){
  9. static char*p1,*p2,s[];
  10. if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
  11. return(p1==p2)?EOF:*p1++;
  12. }
  13. ll rd(){
  14. ll x=; char c=gc();
  15. while(c<''||c>'')c=gc();
  16. while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
  17. return x;
  18. }
  19. int n,T,f[N],o=,hd[N],dep[N],fa[N][],bin[];
  20. int idx,sz[N],tp[N],sn[N],mx[N],id[N],cnt[N<<],st[N];
  21. ll dp[N],tmp,dis[N],s[N],p[N],q[N],l[N];
  22. struct Poi{
  23. ld x,y;
  24. Poi(ld _x=,ld _y=):x(_x),y(_y){};
  25. Poi operator -(const Poi&a){return Poi(x-a.x,y-a.y);}
  26. ld operator ^(const Poi&a){return x*a.y-y*a.x;}
  27. bool operator <(const Poi&a){return x==a.x?y<a.y:x<a.x;}
  28. }P[N];
  29. vector<int>g1[N<<],g2[N];
  30. struct Edge{int v,nt;}E[N];
  31. void adde(int u,int v){E[o]=(Edge){v,hd[u]};hd[u]=o++;}
  32. void dfs1(int u){
  33. sz[u]=;
  34. fa[u][]=f[u];
  35. dep[u]=dep[f[u]]+;
  36. dis[u]=dis[f[u]]+s[u];
  37. for(int i=;bin[i]<dep[u];++i)fa[u][i]=fa[fa[u][i-]][i-];
  38. for(int i=hd[u];i;i=E[i].nt){
  39. int v=E[i].v;
  40. dfs1(v);
  41. sz[u]+=sz[v];
  42. if(sz[v]>sz[sn[u]])sn[u]=v;
  43. }
  44. }
  45. void dfs2(int u,int t){
  46. tp[u]=t;
  47. id[u]=++idx;
  48. st[idx]=u;
  49. if(sn[u])dfs2(sn[u],t);
  50. for(int i=hd[u];i;i=E[i].nt){
  51. int v=E[i].v;
  52. if(v==sn[u])continue;
  53. dfs2(v,v);
  54. }
  55. }
  56. inline bool judge(int a,int b,int c){return ((P[b]-P[a])^(P[c]-P[b]))<=;}
  57. void pushup(int k){
  58. int l=ls,r=rs,tl=,tr=;
  59. while(tl<(int)g1[l].size()||tr<(int)g1[r].size()){
  60. if(tr==(int)g1[r].size()||(tl<(int)g1[l].size()&&g1[l][tl]<g1[r][tr])){
  61. while(g1[k].size()>&&judge(g1[k][g1[k].size()-],g1[k].back(),g1[l][tl]))g1[k].pop_back();
  62. g1[k].push_back(g1[l][tl++]);
  63. }else{
  64. while(g1[k].size()>&&judge(g1[k][g1[k].size()-],g1[k].back(),g1[r][tr]))g1[k].pop_back();
  65. g1[k].push_back(g1[r][tr++]);
  66. }
  67. }
  68. }
  69. void ins1(int k,int l,int r,int u){
  70. cnt[k]++;
  71. if(l==r){g1[k].push_back(u);return;}
  72. int mid=(l+r)>>;
  73. if(id[u]<=mid)ins1(ls,l,mid,u);
  74. else ins1(rs,mid+,r,u);
  75. if(tp[st[l]]==tp[st[r]]&&cnt[k]==r-l+)pushup(k);
  76. }
  77. void ins2(int k,int u){
  78. while(g2[k].size()>&&judge(g2[k][g2[k].size()-],g2[k].back(),u))g2[k].pop_back();
  79. g2[k].push_back(u);
  80. }
  81. inline bool ok(int u,int v){return dis[u]-dis[v]<=l[u];}
  82. inline void upd(ll&x,ll y){if(x>y)x=y;}
  83. void cal(vector<int>&g,int u){
  84. int l=,r=g.size()-;
  85. while(r-l>){
  86. int mid=(r-l)/,mid1=l+mid,mid2=r-mid;
  87. ll t1=dp[g[mid1]]-dis[g[mid1]]*p[u];
  88. ll t2=dp[g[mid2]]-dis[g[mid2]]*p[u];
  89. if(t1>t2)l=mid1+;
  90. else r=mid2-;
  91. }
  92. for(int i=l;i<=r;++i)upd(tmp,dp[g[i]]-dis[g[i]]*p[u]);
  93. }
  94. void query1(int k,int l,int r,int x,int y,int u){
  95. if(l==x&&r==y){cal(g1[k],u);return;}
  96. int mid=(l+r)>>;
  97. if(y<=mid)query1(ls,l,mid,x,y,u);
  98. else if(x>mid)query1(rs,mid+,r,x,y,u);
  99. else query1(ls,l,mid,x,mid,u),query1(rs,mid+,r,mid+,y,u);
  100. }
  101. void query2(int x,int u){
  102. cal(g2[x],u);
  103. }
  104. void solve(int u){
  105. tmp=u==?:9e18;
  106. for(int x=f[u],t=tp[x];x;x=f[t],t=tp[x]){
  107. if(dep[mx[u]]<dep[t])query2(id[t],u);
  108. else {query1(,,n,id[mx[u]],id[x],u);break;}
  109. }
  110. dp[u]=dis[u]*p[u]+q[u]+tmp;
  111. P[u]=Poi(dis[u],dp[u]);
  112. ins1(,,n,u);
  113. ins2(id[tp[u]],u);
  114. }
  115. void calmx(int u){
  116. int t=u;
  117. for(int i=;~i;--i)if(fa[t][i]&&ok(u,fa[t][i]))t=fa[t][i];
  118. mx[u]=t;
  119. }
  120. void dfs3(int u){
  121. calmx(u);
  122. solve(u);
  123. for(int i=hd[u];i;i=E[i].nt){
  124. int v=E[i].v;
  125. if(v==sn[u])continue;
  126. dfs3(v);
  127. }
  128. if(sn[u])dfs3(sn[u]);
  129. }
  130. int main(){
  131. #ifndef ONLINE_JUDGE
  132. freopen("bzoj3672.in","r",stdin);
  133. freopen("bzoj3672.out","w",stdout);
  134. #endif
  135. for(int i=bin[]=;i<=;++i)bin[i]=bin[i-]<<;
  136. n=rd();T=rd();
  137. for(int i=;i<=n;++i){
  138. adde(f[i]=rd(),i);
  139. s[i]=rd();p[i]=rd();
  140. q[i]=rd();l[i]=rd();
  141. }
  142. dfs1();
  143. dfs2(,);
  144. dfs3();
  145. for(int i=;i<=n;++i)printf("%lld\n",dp[i]);
  146. return ;
  147. }

bzoj3672【NOI2014】购票的更多相关文章

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

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

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

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

  3. BZOJ3672: [Noi2014]购票【CDQ分治】【点分治】【斜率优化DP】

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

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

    题目链接 BZOJ3672 题解 如果暂时不管\(l[i]\)的限制,并假使这是一条链 设\(f[i]\)表示\(i\)节点的最优答案,我们容易得到\(dp\)方程 \[f[i] = min\{f[j ...

  5. BZOJ3672: [Noi2014]购票(CDQ分治,点分治)

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

  6. BZOJ3672 : [Noi2014]购票

    设d[i]表示i到1的距离 f[i]=w[i]+min(f[j]+(d[i]-d[j])*v[i])=w[i]+d[i]*v[i]+min(-d[j]*v[i]+f[j]) 对这棵树进行点分治,每次递 ...

  7. BZOJ3672: [Noi2014]购票(dp 斜率优化 点分治 二分 凸包)

    题意 题目链接 Sol 介绍一种神奇的点分治的做法 啥?这都有根树了怎么点分治?? 嘿嘿,这道题的点分治不同于一般的点分治.正常的点分治思路大概是先统计过重心的,再递归下去 实际上一般的点分治与统计顺 ...

  8. bzoj3672: [Noi2014]购票(树形DP+斜率优化+可持久化凸包)

    这题的加强版,多了一个$l_i$的限制,少了一个$p_i$的单调性,难了好多... 首先有方程$f(i)=min\{f(j)+(dep_i-dep_j)*p_i+q_i\}$ $\frac {f(j) ...

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

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

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

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

随机推荐

  1. 使用json.dumps转换django queryset的datatime报错问题解决

    转换成json时使用的方法如下: json.dumps(list(models.userlist.objects.values("vu"))) 报错信息如下: Traceback ...

  2. 【探路者】Beta发布用户使用报告

    用户数量:18 一.用户列表及评论.  用户序号 用户来源 用户下载软件途径 用户姓名 用户描述(信息) 使用次数 用户评价 1  张恩聚  QQ发送可运行jar包  周楠  吉林大学在读研究生  5 ...

  3. 软件功能说明书final修订

    贪吃蛇(单词版)软件功能说明书final修订 1 开发背景 “贪吃蛇”这个游戏对于80,90后的人来说是童年的记忆,可以将其说为是一个时代的经典,实现了传统贪吃蛇的游戏功能:现在人们对英语的重视程度越 ...

  4. YQCB绩效表

    标准 队员 工作质量 20% 工作态度 20% 工作量 30% 工作难易程度 20% 团队意识 10% 总分 陈美琪 17 18 28 19 9 91 张晨阳 16 16 25 17 9 83 刘昭为 ...

  5. CentOS中Intel i350T4驱动安装

    2015.3.31 在linux*中直接按解决方法中安装i350驱动即可 *************************************************************** ...

  6. Spring笔记③--spring的命名空间

    p:命名空间: xmlns:p="http://www.springframework.org/schema/p" 作用:简化在xml配置bean的属性 在<bean> ...

  7. arcgis 10.3中文版安装教程、配置及常见问题(百度的有些错误)

    参考的: 1.http://wenku.baidu.com/link?url=W-wo_lEMvzHxF19w91X7H0WDjyCQ16DjGu4ViaZ4-eVPr0NTU-LrZTPK1oyzT ...

  8. nodeJS + webStrome

    一.配置开发环境: 1.先安装node (1).访问http://nodejs.org打开安装包,正常安装,点击next即可. 为了测试是否安装成功,打开命令提示符,输入node,则进入node.js ...

  9. iOS开发值得收藏的博客

    http://kobedai.me/ objc.io PS:经典,内容深而广objc中国NSHipster PS:很多小细节NSHipster 中文版唐巧的技术博客 PS:LZ是唐巧的脑残粉…OneV ...

  10. Delphi函数的out、var等关键字的作用,和使用场景

    问题描述 Delphi函数的out.var等关键字的作用,和使用场景 Delphi函数的out.var等关键字的作用,和使用场景,我知道var是作为传值调用,但是像out这个关键字又是什么作用呢? 解 ...