P2305 [NOI2014]购票

题目描述

详见:P2305 [NOI2014]购票

Solution

写出一个朴素的DP可以看出显然是一个斜率优化,且是在树上求解答案。

因此用点分治维护树上斜率优化DP。

设现在的重心为,根为,我们需要先递归处理所在的连通块。

接下来用     的路径上的值更新下面的点。

按这些点可以到达的最浅祖先的深度排序,依次加入新点,斜率优化维护,二分凸包求解答案即可。

时间复杂度   

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=2e5+50;
const int INF=0x3f3f3f3f;
const ll loo=1ll<<60;
double slope[MAXN];
struct enode{ll to,nxt,c; } e[MAXN<<1];
ll edgenum=0,smin,root,num,top;
ll st[MAXN],size[MAXN],vis[MAXN],dis[MAXN],f[MAXN],E[MAXN],head[MAXN],p[MAXN],q[MAXN],l[MAXN],fa[MAXN];
inline ll read()
{ll x=0,f=1; char c=getchar();while (c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
void add_edge(int u,int v,ll c) { e[++edgenum]=(enode){v,head[u],c}; head[u]=edgenum; }
void get_dis(int x)
{ for (int i=head[x];i!=-1;i=e[i].nxt) dis[e[i].to]=dis[x]+e[i].c,get_dis(e[i].to);
}
void get_root(int x,int Size)
{size[x]=1; ll mx=0;for (int i=head[x];i!=-1;i=e[i].nxt)if (!vis[e[i].to]){get_root(e[i].to,Size);size[x]+=size[e[i].to];mx=max(mx,size[e[i].to]);}mx=max(mx,Size-size[x]);if (smin>=mx) root=x,smin=mx;
}
void build(int x)
{E[++num]=x;for (int i=head[x];i!=-1;i=e[i].nxt) if (!vis[e[i].to]) build(e[i].to);
}
double slp(int x,int y){ return (1.0*f[y]-f[x])/(1.0*dis[y]-dis[x]); }
int compareE(int x,int y){ return dis[x]-l[x]>dis[y]-l[y]; }
void insert(int x)
{while (top>=2&&slope[top-1]<=slp(st[top],x)) top--;st[++top]=x,slope[top]=-1e18,slope[top-1]=slp(st[top-1],st[top]);
}
ll query(double x)
{ll l=1,r=top,ans;while (l<=r){ll mid=(l+r)>>1;if (slope[mid]<=x) ans=mid,r=mid-1;else l=mid+1;}return st[ans];
}
void solve(int x,int Size)
{if (Size==1) return;root=smin=INF;get_root(x,Size);ll rt=root,mx=smin;for (int i=head[rt];i!=-1;i=e[i].nxt) vis[e[i].to]=1,Size-=size[e[i].to];//cout<<Size<<" "<<rt<<" "<<mx<<endl;solve(x,Size);num=0;for (int i=head[rt];i!=-1;i=e[i].nxt) build(e[i].to);sort(E+1,E+num+1,compareE);top=0;for (int i=1,j=rt;i<=num;i++){while (j!=fa[x]&&dis[j]>=dis[E[i]]-l[E[i]]) insert(j),j=fa[j];if (top){int k=query(p[ E[i] ]);f[ E[i] ]=min(f[ E[i] ],f[k]+(dis[ E[i] ]-dis[k])*p[ E[i] ]+q[ E[i] ]);}}for (int i=head[rt];i!=-1;i=e[i].nxt) solve(e[i].to,size[e[i].to]);
}
int main()
{int n=read(),t=read();for (int i=1;i<=n;i++) head[i]=-1;for (int i=2;i<=n;i++) {int u=read(),c=read(); p[i]=read(),q[i]=read(),l[i]=read(),f[i]=loo;add_edge(u,i,c); fa[i]=u;} get_dis(1);solve(1,n);for (int i=2;i<=n;i++) printf("%lld\n",f[i]);return 0;
}

P2305 [NOI2014]购票相关推荐

  1. P2305 [NOI2014] 购票(点分治、斜率优化)

    解析 第一道完全自己做出来的黑题awa (如果不算那道感觉完全是恶评的石油的话) 然而连写带调整了3.5h- 容易想到链的做法 设ancxanc_xancx​表示x的祖先,disxdis_xdisx​ ...

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

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

  3. UOJ 7 NOI2014 购票

    题意:给一棵树计算一下各个点在距离限制下以一定的费用公式通过不停地到祖先最后到达一号点的最小花费. 第一种做法:线段树维护带修凸壳.显然的,这个公式计算是p*x+q 所以肯定和斜率有关系.然后这题的d ...

  4. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  5. 2016浙江省赛过山车记

    省赛后一天就是期中考真刺激,可以体验连续滚粗的快感. 听说今天是鸟神的生日,于是凌晨造了个大新闻,强行给鸟神灌了一大口毒奶. 热身赛写模拟写到结束也没调出来,给下午滚粗奠定了坚实的基础. 正赛,打开题 ...

  6. NOI2010~NOI2018选做

    [NOI2010] [NOI2010]海拔 高度只需要0/1,所以一个合法方案就是一个割,平面图求最小割. [NOI2010]航空管制 反序拓扑排序,每次取出第一类限制最大的放置,这样做答案不会更劣. ...

  7. 【CTSC2016】时空旅行

    链接 http://uoj.ac/problem/198 题解 首先要发现答案要我们求这个式子: \[ ans=min\bigl((x_i-x)^2+c_i\bigr) \] 显而易见的是这种时空嫁接 ...

  8. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP

    题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...

  9. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

最新文章

  1. springboot默认数据源如何设置连接数_spring boot基于DRUID数据源密码加密及数据源监控实现...
  2. 【错误记录】Tinker 热修复示例运行报错 ( Execution failed for task ‘:app:tinkerProcessD‘ . tinkerId is not set!!! )
  3. 【渝粤题库】国家开放大学2021春1080工程数学(本)题目
  4. python是动态_1.2. Python是动态语言
  5. 【java】java 局部变量表中的槽是可以重用的
  6. hdu-5645 DZY Loves Balls(水题)
  7. DNN Navisuite菜单模块原始XML文件的格式
  8. 解决PHP不打印任何东西浏览器输出字符串
  9. tomcat加载出现找不到web
  10. matlab-imresize-最近邻插值、双线性插值、双三次插值学习总结
  11. 永远的Beyond, 永远的家驹
  12. XJTU 新闻英语阅读unit1作业答案
  13. 9.ansible变量之fact
  14. 从事软件行业的第759天,人还是要经常审视自己
  15. C语言开发必会 宏定义、宏函数
  16. 夺命雷公狗---DEDECMS----32dedecms电影网评价星星功能的实现
  17. 150行Python代码模拟太阳系行星运转
  18. 【软件测试】黑盒测试方法小结
  19. 谷歌浏览器 翻译失败解决办法
  20. tcpdump arping nsenter

热门文章

  1. 世界上最美的40个小镇,你见过多少个?
  2. 趁爸妈不在家约男朋友回家吃饭,然而......
  3. 男科医生到底有多不正经… | 今日最佳
  4. 论文排版怕翻车?这个排版神器赶紧用起来!
  5. 百度内部培训PPT流出:数据分析的道与术
  6. 程序员江湖鄙视链大全,看看你处于链条的哪一级?
  7. 计算机Word应用程序,Word2007目录设置_计算机软件和应用程序_IT /计算机_信息
  8. charts漏斗图表_ECharts漏斗图属性与实例介绍
  9. 伪装 php 版本号,linux伪装隐藏Nginx,PHP版本号提升服务器安全性
  10. python怎么读数据库的数据_python从数据库读取出来的字典怎么更加方便的插入数据库...