[NOI2014] 购票 题解
首先发现 \(p_x\times dis(x,y)+q_x\) 异常像是能斜率优化的样子,那先把求 \(f_x\) 的式子写出来(下设 \(d_x\) 表示 \(x\) 到根的距离):
\]
提出公共部分 \(p_x\times d_x+q_x\),得:
\]
那当 \(y\) 优于 \(z\) 时(设 \(d_y<d_z\)),一定满足:
\]
\]
\]
那这里就形成了一个斜率优化 \(dp\) 的式子,得用单调栈维护凸包。
但是这里就出现了一个很现实的问题:实际上你要维护的是多个滑动窗口内的凸包,也就意味着你原来淘汰的点可能在后面的决策中再次出现!
问题转化为维护后缀凸包,考虑树状数组维护单调栈,这样就能在 \(O(n\log^2n)\) 的时间中解决问题。
最后发现由于是在树上,所以要支持可撤销,但是明显的,单调栈的时间复杂度是均摊的,单次修改仍然有可能达到 \(O(n)\),所以单调队列插入时,应当使用二分找到插入点,保证单次时间复杂度 \(O(\log n)\)。
时间复杂度 \(O(n\log^2n)\)。注意单调栈要用 \(vector\)。
#include<bits/stdc++.h>
#define int long long
#define db double
using namespace std;
const int N=2e5+5,M=4e6+5;
struct del{
int id,tp,ps;
}sk[M];vector<int>g[N];
int n,m,idx[N],ln[N],ft;
int d[N],p[N],q[N],f[N];
struct mstack{
int tp=-1;vector<int>st;
db sp(int x,int y){
return 1.0*(f[x]-f[y])/(d[x]-d[y]);
}int cmp(int x,int y,int z){
return sp(x,y)>=sp(y,z);
}void add(int x,int id){
int l=1,r=tp,ans=tp+1;
while(l<=r){
int mid=(l+r)/2;
if(cmp(st[mid-1],st[mid],x))
ans=mid,r=mid-1;
else l=mid+1;
}if(ans>tp) st.push_back(0);
sk[++ft]={id,tp,st[ans]},st[tp=ans]=x;
}int ans(int x){
if(tp<0) return (int)9e18;
int l=0,r=tp-1,ans=st[tp];
while(l<=r){
int mid=(l+r)/2;
if(sp(st[mid],st[mid+1])>x)
ans=st[mid],r=mid-1;
else l=mid+1;
}return f[ans]-d[ans]*x;
}
};namespace BIT{
mstack c[N];
void clear(int lft){
while(ft>lft){
del x=sk[ft--];
c[x.id].st[c[x.id].tp]=x.ps;
c[x.id].tp=x.tp;
}
}void add(int x,int v){
x=n-x+1;
for(;x<=n;x+=x&-x)
c[x].add(v,x);
}int ans(int x,int v){
int mn=9e18;x=n-x+1;
for(;x;x-=x&-x)
mn=min(mn,c[x].ans(v));
return mn;
}
}using namespace BIT;
void dfs(int x,int fa){
idx[++m]=(d[x]+=d[fa]);
int cc=lower_bound(idx+1,idx+m+1,d[x]-ln[x])-idx,lft=ft;
if(x>1) f[x]=d[x]*p[x]+q[x]+ans(cc,p[x]);add(m,x);
for(auto y:g[x]) dfs(y,x);clear(lft),m--;
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>ft,ft=0;
for(int i=2;i<=n;i++){
int fa;cin>>fa>>d[i]>>p[i]>>q[i];
cin>>ln[i],g[fa].push_back(i);
}dfs(1,0);
for(int i=2;i<=n;i++)
cout<<f[i]<<"\n";
return 0;
}
[NOI2014] 购票 题解的更多相关文章
- [BZOJ3672][UOJ#7][NOI2014]购票
[BZOJ3672][UOJ#7][NOI2014]购票 试题描述 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. ...
- 【BZOJ 3672】 3672: [Noi2014]购票 (CDQ分治+点分治+斜率优化)**
3672: [Noi2014]购票 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国 ...
- 【BZOJ3672】[Noi2014]购票 树分治+斜率优化
[BZOJ3672][Noi2014]购票 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. ...
- BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)
前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...
- $NOI2014$ 购票(斜率优化 点分治)
\(NOI2014\)购票 哇终于可以碰电脑了赶快切些火题找找感觉. 拿到这道题的时候发现简单的斜率优化推一推可以秒掉平方做法,然后一条链也可以做. 然后呢... 卧槽这个在一棵树上怎么办啊. 大力\ ...
- bzoj 3672: [Noi2014]购票 树链剖分+维护凸包
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 480 Solved: 212[Submit][Status][D ...
- BZOJ 3672: [Noi2014]购票( 树链剖分 + 线段树 + 凸包 )
s弄成前缀和(到根), dp(i) = min(dp(j) + (s(i)-s(j))*p(i)+q(i)). 链的情况大家都会做...就是用栈维护个下凸包, 插入时暴力弹栈, 查询时就在凸包上二分/ ...
- bzoj千题计划251:bzoj3672: [Noi2014]购票
http://www.lydsy.com/JudgeOnline/problem.php?id=3672 法一:线段树维护可持久化单调队列维护凸包 斜率优化DP 设dp[i] 表示i号点到根节点的最少 ...
- [BZOJ3672][Noi2014]购票 斜率优化+点分治+cdq分治
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1749 Solved: 885[Submit][Status][ ...
- [NOI2014]购票 --- 斜率优化 + 树形DP + 数据结构
[NOI2014]购票 题目描述 今年夏天,NOI在SZ市迎来了她30周岁的生日. 来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每 ...
随机推荐
- canvas(三)绘制矩形
1.绘制矩形轨迹 相关语法:ctx.rect(x,y,width,height),根据传入的参数(起始坐标和宽高)用来绘制一个矩形轨迹 注意:ctx.rect()和ctx.lineTo()绘制的都是轨 ...
- 【Android】谷歌应用关机闹钟 PowerOffAlarm 源码分析,并实现定时开、关机
前言 RTC RTC 即实时时钟(Real-Time Clock),主要是功能有: 时间保持:RTC可以在断电的时候,仍然保持计时功能,保证时间的连续性 时间显示与设置:RTC可以向系统提供年.月.日 ...
- 一款基于 .NET MVC 框架开发、功能全面的MES系统
前言 今天大姚给大家分享一款基于 .NET MVC 框架开发.功能全面的离散型零部件制造管理系统(MES):EasyMES. 项目介绍 EasyMES一款基于 .NET 6 MVC 框架开发.开源免费 ...
- 配置 Forwarded Headers Middleware
来自微软的说明:Configure ASP.NET Core to work with proxy servers and load balancers | Microsoft Learn. 通过该中 ...
- 2024年1月Java项目开发指南5:controller、service、mapper
准备工作 你知道什么是JSON吗? JSON是什么? 格式是什么? 有什么用? 有什么优点? 有什么缺点? 请自己百度探索一下,对JSON做了个了解,如果你不知道什么是JSON的话,知道就免了,直接下 ...
- maven:Could not transfer artifact from/to maven-default-http-blocker (http://0.0.0.0/): Blocked m...
今天在拉完项目后拉取包的过程中,maven报错: Could not transfer artifact from/to 对应的包 maven-default-http-blocker (http:/ ...
- Qt编写可视化大屏电子看板系统20-横向分组图
一.前言 横向分组图是柱状分组图的横向展示,有了横向柱状图加上分组图的绘制经验,这个做起来就比较简单了,横向的设置规则按照横向柱状图来,分组的规则按照柱状分组图的算法来,在横向的柱子中要绘制对应的值, ...
- Qt编写安防视频监控系统45-图文报表
一.前言 图文报表对应以前的文字报表,以前的日志查询后,需要打印或者导出,都是一行行的文字记录,近期需要图文警情记录打印和导出,于是彻底趁机将之前的数据导入导出(xls/pdf)及打印组件彻底改造重写 ...
- Qt音视频开发43-人脸识别服务端
一.前言 上一篇文章写道人脸识别客户端程序,当然要对应一个服务端程序,客户端才能正常运行,毕竟客户端程序需要与服务端程序进行交互他才能正常工作.通常人脸识别服务端程序需要和人脸识别的相关处理库在一起, ...
- 生产环境Sentinel改造实践(二):规则管理推送改造
前文介绍了Sentinel相关的核心概念,本文开始动手对规则管理推送进行改造. 这里挑选流控规则模式改造为示例 Sentinel Dashboard 改造 在com.alibaba.csp.senti ...