1767: [Ceoi2009]harbingers


Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 451  Solved: 120
[Submit][Status][Discuss]

Description


给定一颗树,树中每个结点有一个邮递员,每个邮递员要沿着唯一的路径走向capital(1号结点),每到一个城市他可以有两种选择: 1.继续走到下个城市 2.让这个城市的邮递员替他出发。 每个邮递员出发需要一个准备时间W[I],他们的速度是V[I],表示走一公里需要多少分钟。 现在要你求出每个城市的邮递员到capital的最少时间(不一定是他自己到capital,可以是别人帮他) N<=100000 3 ≤ N ≤ 100 000 0 ≤ Si≤ 10^9 1 ≤ Vi≤ 10^9 The length of each road will not exceed 10 000 For 20% of the tests, N ≤ 2 500 For 50% of the tests, each town will have at most 2 adjacent roads (i.e., the graph of roads will be a line)

Input


N 以下N-1行A,B,C三个数表示A,B之间有一条长为C的边。 再N行每行两数Wi,Vi

Output


  输出有一行N-1个数表示如题所述。

Sample Input


  1.  

Sample Output


HINT


分析:


考虑暴力

其中j为i的祖先。

发现很显然的斜率优化式子模型,转化成点斜式

发现x是单增的,可以使用单调栈维护下凸包,答案就是使截矩b最小的点对(x,y)

但发现斜率k是不单调的,代表决策不单调,所以只有采用二分寻找最优决策。

这还是很显然的,但是这道题是在树上,树上根节点到当前点的凸包要在它每个儿子都会使用到,要想办法维护根节点到每个点的凸包。

我们加入一个点后,不从队首开始pop,而是二分寻找它该加入的位置,把那个位置改成当前点,并记录下原来的点和位置。

处理它的所有儿子结点后,又把当前点改回原来的点。这样就做到保存各点凸包信息了。

坑点:会炸long long  比较斜率的时候被迫使用double。

AC代码:


  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. using namespace std;
  5. const int N = 3e5 + ;
  6. typedef long long LL;
  7. int n,dt,head[N],que[N];LL f[N],d[N],v[N],w[N];
  8. struct Edge{
  9. int to,nex;LL w;
  10. }edge[N << ];
  11. void AddEdge(int u,int v,LL w)
  12. {
  13. edge[++dt] = (Edge){v,head[u],w};
  14. head[u] = dt;
  15. }
  16. LL x(int i){return d[i];}
  17. LL y(int i){return f[i];}
  18. LL Get(int A,int B){return f[A] + (d[B] - d[A]) * v[B] + w[B];}
  19. double slope(int A,int B){return ((double)(y(B) - y(A))) / ((double)(x(B) - x(A)));}
  20. bool Cross(int A,int B,int C){return slope(B,C) <= slope(A,B);}
  21. int find(int x,int tp)
  22. {
  23. int l = ,r = tp,ret = ,mid;
  24. while(l <= r)
  25. {
  26. mid = l + r >> ;
  27. if(Get(que[mid],x) < Get(que[mid - ],x))ret = mid,l = mid + ;
  28. else r = mid - ;
  29. }
  30. return ret;
  31. }
  32. int Find(int z,int tp)
  33. {
  34. int l = ,r = tp,ret = tp + ,mid;
  35. while(l <= r)
  36. {
  37. mid = l + r >> ;
  38. if(Cross(que[mid - ],que[mid],z))ret = mid,r = mid - ;
  39. else l = mid + ;
  40. }
  41. return ret;
  42. }
  43. void dfs(int u,int pos,int fa)
  44. {
  45. int qpos,qtop;
  46. f[u] = Get(que[find(u,pos)],u);
  47. qpos = Find(u,pos);qtop = que[qpos];
  48. que[qpos] = u;
  49. for(int i = head[u];i;i = edge[i].nex)
  50. {
  51. if(edge[i].to == fa)continue;
  52. d[edge[i].to] = d[u] + edge[i].w;
  53. dfs(edge[i].to,qpos,u);
  54. }
  55. que[qpos] = qtop;
  56. }
  57. int main(){
  58. scanf("%d",&n);
  59. int x,y,z;
  60. for(int i = ;i < n;i++)
  61. {
  62. scanf("%d %d %d",&x,&y,&z);
  63. AddEdge(x,y,z);AddEdge(y,x,z);
  64. }
  65. for(int i = ;i <= n;i++)scanf("%lld %lld",&w[i],&v[i]);
  66. dfs(,,);printf("%lld",f[]);
  67. for(int i = ;i <= n;i++)printf(" %lld",f[i]);
  68. }

[Bzoj1767][Ceoi2009]harbingers (树上斜率优化)的更多相关文章

  1. [NOI2014]购票 「树上斜率优化」

    首先易得方程,且经过变换有 $$\begin{aligned} f_i &= \min\limits_{dist_i - lim_i \le dist_j} \{f_j + (dist_i - ...

  2. [洛谷U22158]策划体验(树上斜率优化)(二分最优决策)

    题目背景 OL不在,Clao又在肝少*前线,他虽然觉得这个游戏的地图很烦,但是他认为地图的难度还是太低了,习习中作为策划还不够FM,于是他自己YY了一种新的地图和新的机制: 题目描述 整个地图呈树形结 ...

  3. bzoj1767[Ceoi2009]harbingers 斜率优化dp

    1767: [Ceoi2009]harbingers Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 421  Solved: 112[Submit][S ...

  4. HDU - 59562016ACM/ICPC亚洲区沈阳站I - The Elder 树上斜率优化dp

    题意:给定上一棵树,然后每条边有一个权值,然后每个点到 1 的距离有两种,第一种是直接回到1,花费是 dist(1, i)^2,还有另一种是先到另一个点 j,然后两从 j 向1走,当然 j 也可以再向 ...

  5. BZOJ1767 : [Ceoi2009]harbingers

    设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]) 对这棵树进行点分治,每次递 ...

  6. 【BZOJ-3672】购票 树分治 + 斜率优化DP

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

  7. 洛谷 P3994 高速公路(斜率优化)

    题目链接 题意:给出一棵树,\(1\) 号点为根,边上有边权. 每个点有两个参数 \(p_i,q_i\) 如果你想从 \(i\) 号点到与其距离为 \(d\) 的 \(j\) 号点,那么你需花费 \( ...

  8. BZOJ1767/Gym207383I CEOI2009 Harbingers 斜率优化、可持久化单调栈、二分

    传送门--BZOJCH 传送门--VJ 注:本题在BZOJ上是权限题,在Gym里面也不能直接看,所以只能在VJ上交了-- 不难考虑到这是一个\(dp\). 设\(dep_x\)表示\(x\)在树上的带 ...

  9. BZOJ 1767] [Ceoi2009] harbingers (斜率优化)

    [BZOJ 1767] [Ceoi2009] harbingers (斜率优化) 题面 给定一颗树,树中每个结点有一个邮递员,每个邮递员要沿着唯一的路径走向capital(1号结点),每到一个城市他可 ...

随机推荐

  1. qt project settings被禁用解决方案

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7422707.html qt project settings被禁用点击不了: 解决方案:需要点击该项目(或者项 ...

  2. Cognos添加维度

    1.打开后台cognos中的报表,创建查询主题 填写该维度的名称 以时间维度为例 从左边添加该维度的单位,修改名称(在Cognos前台显示),如果有逻辑在源里面修改下函数 以此类推.

  3. 最新精品 强势来袭 XP,32/64位Win7,32/64位Win8,32/64位Win10系统【国庆版版】

    本系统是10月最新完整版本的Windows10 安装版镜像,Win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为Win10 Edge浏览器中国默认主页和搜索引擎,系 ...

  4. 洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day

    题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self ...

  5. 【整理】treeGrid 树形表格

    treeGrid 树形表格 https://fly.layui.com/extend/treeGrid/

  6. render_to_response()

    render_to_response('模板名称',字典) 字典:第二个参数必须是为该模板创建context时所使用的字典,如果不提供第二个参数,render_response()使用一个空字典

  7. C++ 类中的static成员的初始化和特点

    C++ 类中的static成员的初始化和特点 #include <iostream> using namespace std; class Test { public: Test() : ...

  8. 硬盘写入 iso

    https://www.jb51.net/softjc/508796.html WinImage 正确操作是要有两个or以上-硬盘. 这样才能写入你要装的操作系统 测试或者安装

  9. MySQL redo log 与 binlog 的区别

    MySQL redo log 与 binlog 的区别 什么是redo log 什么是binlog redo log与binlog的区别 1. 什么是redo log? redo log又称重做日志文 ...

  10. js layui 分页脚本

    //分页 layui.use(['laypage'], function(){ var laypage = layui.laypage; laypage.render({ elem: 'page' , ...