http://uoj.ac/problem/7 (题目链接)

题意

  给出一棵有根树,每次从一个节点出发可以买票到达它的一定范围内的祖先。问对于每一个点,到达根的最小花费是多少。

Solution

  右转题解→_→:LCF

  一些细节自己YY一下就好,看看代码也行。

细节

  最好写读入优化?

代码

  1. // uoj7
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<cstdio>
  7. #include<cmath>
  8. #define LL long long
  9. #define inf (1ll<<60)
  10. #define Pi acos(-1.0)
  11. #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  12. using namespace std;
  13. inline LL gi() {
  14. LL x=0,f=1;char ch=getchar();
  15. while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}
  16. while (ch<='9' && ch>='0') {x=x*10+ch-'0';ch=getchar();}
  17. return x*f;
  18. }
  19.  
  20. const int maxn=200010;
  21. int n,T,cnt,a[maxn],par[maxn],head[maxn];
  22. LL d[maxn],Q[maxn],P[maxn],L[maxn],ans[maxn];
  23.  
  24. struct node {LL w;int num;}t[maxn];
  25. struct edge {int to,next;}e[maxn<<1];
  26.  
  27. namespace DP {
  28. int l,r,q[maxn];
  29. void Clear() {l=1,r=0;}
  30. double slope(int i,int j) {
  31. return (double)(ans[i]-ans[j])/(d[i]-d[j]);
  32. }
  33. void push(int x) {
  34. while (l<r && slope(q[r-1],q[r])<slope(x,q[r])) r--;
  35. q[++r]=x;
  36. }
  37. void update(int x) {
  38. if (l>r) return;
  39. int ll=l,rr=r,y;
  40. while (ll<=rr) {
  41. int mid=(ll+rr)>>1;
  42. if (ll<mid && slope(q[mid-1],q[mid])<P[x]) y=mid,rr=mid-1;
  43. else if (rr>mid && slope(q[mid],q[mid+1])>P[x]) y=mid,ll=mid+1;
  44. else {y=mid;break;}
  45. }
  46. y=q[y];
  47. ans[x]=min(ans[x],ans[y]+(d[x]-d[y])*P[x]+Q[x]);
  48. }
  49. }
  50. using namespace DP;
  51.  
  52. namespace NodeDivide {
  53. int size[maxn],f[maxn],vis[maxn];
  54. int Dargen,sum,dfn;
  55. bool cmp(node a,node b) {
  56. return a.w>b.w;
  57. }
  58. void caldargen(int x,int fa) {
  59. size[x]=1;f[x]=0;
  60. for (int i=head[x];i;i=e[i].next) if (e[i].to!=fa && !vis[e[i].to]) {
  61. caldargen(e[i].to,x);
  62. size[x]+=size[e[i].to];
  63. f[x]=max(f[x],size[e[i].to]);
  64. }
  65. f[x]=max(f[x],sum-size[x]);
  66. if (f[x]<f[Dargen]) Dargen=x;
  67. }
  68. void dfs(int x,int fa) {
  69. a[++dfn]=x;
  70. for (int i=head[x];i;i=e[i].next) if (e[i].to!=fa && !vis[e[i].to]) dfs(e[i].to,x);
  71. }
  72. void work(int x) {
  73. vis[x]=1;
  74. if (!vis[par[x]]) {
  75. sum=size[par[x]];
  76. Dargen=0;caldargen(par[x],x);
  77. work(Dargen);
  78. }
  79. Clear();
  80. for (int j=par[x];!vis[j] && d[x]-d[j]<=L[x];j=par[j]) push(j);
  81. update(x);
  82. dfn=0;
  83. for (int i=head[x];i;i=e[i].next)
  84. if (!vis[e[i].to] && e[i].to!=par[x]) dfs(e[i].to,x);
  85. for (int i=1;i<=dfn;i++) t[i]=(node){d[a[i]]-L[a[i]],a[i]};
  86. sort(t+1,t+1+dfn,cmp);
  87. Clear();
  88. for (int j=x,i=1;i<=dfn;i++) {
  89. for (;(!vis[j] || j==x) && t[i].w<=d[j];j=par[j]) push(j);
  90. update(t[i].num);
  91. }
  92. for (int i=head[x];i;i=e[i].next) if (e[i].to!=par[x] && !vis[e[i].to]) {
  93. sum=size[e[i].to],Dargen=0;
  94. caldargen(e[i].to,x);
  95. work(Dargen);
  96. }
  97. vis[x]=0;
  98. }
  99. void Init() {
  100. f[Dargen=0]=1<<30;
  101. sum=n;vis[0]=1;
  102. caldargen(1,0);
  103. work(Dargen);
  104. }
  105. }
  106.  
  107. void link(int u,int v) {
  108. e[++cnt]=(edge){v,head[u]};head[u]=cnt;
  109. e[++cnt]=(edge){u,head[v]};head[v]=cnt;
  110. }
  111. int main() {
  112. n=gi(),T=gi();
  113. for (int i=2;i<=n;i++) {
  114. par[i]=gi(),d[i]=gi(),P[i]=gi(),Q[i]=gi(),L[i]=gi();
  115. d[i]+=d[par[i]];ans[i]=inf;link(i,par[i]);
  116. }
  117. NodeDivide::Init();
  118. for (int i=2;i<=n;i++) printf("%lld\n",ans[i]);
  119. return 0;
  120. }

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

  1. BZOJ3672/UOJ7 [Noi2014]购票

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Delphi 7~XE系列升级安装Indy10.6

    由于低版本Indy无法满足网络技术的日益更新,如SSL/TLS请求.RawHeaders与Cookie管理等问题处理. 我本身一直在用Delphi 2007,因为D2009开始底层的编码已不同,旧项目 ...

  2. 20155211 网络攻防技术 Exp08 Web基础

    20155211 网络攻防技术 Exp08 Web基础 实践内容 Web前端HTML,能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. We ...

  3. 后端自动构建前端css和js

    引子: 别的复杂前端开发技术不会,用得多的还是手写代码,手动处理. 3年前手写合并压缩js和css文件的asp脚本代码目前还能正常运行,也就没有多大使用别的技术的动力. 直到近期被一个问题纠结着,今天 ...

  4. Security4:授予查看定义,执行SP和只读数据的权限

    SQL Server数据库有完善的权限管理机制,对于存储过程,其权限分为查看定义,执行和修改,查看SP定义的权限是:VIEW DEFINITION ,执行存储过程的权限是:EXECUTE,修改SP的权 ...

  5. stl源码剖析 详细学习笔记deque(1)

    //--------------------------15/3/12---------------------------- deque { deque没有容量(capacity)观念,是动态分段的 ...

  6. nginx location 正则匹配

    nginx 统计语句1.根据访问IP统计UV awk '{print $1}' access.log|sort | uniq -c |wc -l2.统计访问URL统计PV awk '{print $7 ...

  7. 【文章存档】如何通过 GitLab 进行持续部署

    好久没写博客了,这几天存档一下新文章. 链接 https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/a ...

  8. Python能做什么?

    Python作为一个功能强大,并且简单易学的编程语言而广受好评,那么Python都能做些什么呢?概括起来有以下几个方面: 1.Web开发: 2.大数据处理: 3.人工智能: 4.自动化运维: 5.云计 ...

  9. PAT甲级题解-1057. Stack (30)-树状数组

    不懂树状数组的童鞋,正好可以通过这道题学习一下树状数组~~百度有很多教程的,我就不赘述了 题意:有三种操作,分别是1.Push key:将key压入stack2.Pop:将栈顶元素取出栈3.PeekM ...

  10. PAT甲题题解-1072. Gas Station (30)-dijkstra最短路

    题意:从m个加油站里面选取1个站点,使得其离住宅的最近距离mindis尽可能地远,并且离所有住宅的距离都在服务范围ds之内.如果有很多相同mindis的加油站,输出距所有住宅平均距离最小的那个.如果平 ...