[NOI2014] 购票 题解

首先发现 \(p_x\times dis(x,y)+q_x\) 异常像是能斜率优化的样子,那先把求 \(f_x\) 的式子写出来(下设 \(d_x\) 表示 \(x\) 到根的距离):

\[f_x=\min_{lca(x,y)=y,y\ne x}(p_x\times(d_x-d_y)+q_x+f_y) \]

提出公共部分 \(p_x\times d_x+q_x\),得:

\[f_x=p_x\times d_x+q_x+\min_{lca(x,y)=y,y\ne x}(f_y-p_x\times d_y) \]

那当 \(y\) 优于 \(z\) 时(设 \(d_y<d_z\)),一定满足:

\[f_y-p_x\times d_y<f_z-p_x\times d_z \]

\[f_y-f_z<p_x\times(d_y-d_z) \]

\[\dfrac{f_y-f_z}{d_y-d_z}>p_x \]

那这里就形成了一个斜率优化 \(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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857307.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ftrans文件摆渡系统 让跨网文件传输更快捷、更安全!

很多含有敏感信息的行业,包括但不限于:集成电路、政府、金融、能源、医疗、制造以及一些高新技术企业,都会采用网络隔离的方式来保护核心数据,这就产生了跨网文件传输的业务场景。面临这种场景,最好是采用专业的文件摆渡系统来解决传输和管控问题。 一、跨网文件传输的业…

【差分约束】学习笔记

LearningBasic Tips 差分约束,即为存在一个差分约束系统,即类似 \(x_i - x_j \leq k\) 的 \(n\) 元一次不等式组,求出一组解使得该组内所有不等式全部成立,即 \(x_1 = s_1,x_2 = s_2 \dots x_n = s_n\),否则判无解。 对于满足条件的一个解集 \(\{s_1,s_2,s_3,\dots,s_n\}\…

AI车牌监测识别摄像机

AI车牌监测识别摄像机是一种基于人工智能技术的高级监控设备,用于识别和记录车辆的车牌信息。该摄像机利用深度学习算法和图像识别技术,能够快速准确地捕捉车辆牌照信息,有助于提高交通安全管理和追踪犯罪嫌疑车辆。AI车牌监测识别摄像机是一种基于人工智能技术的高级监控设…

dedecms报错The each() function is deprecated

打开报错提示文件对应的行数 把 while (list($key) = each($val)) 改成foreach ($val as $key => $value)扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修…

dedecms文章简介标签infolen控制字数的方法

方法一:底层标签 [field:description/] 改成 [field:infos/] 方法二: [field:description function=cn_substr(@me,66)/]扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网…

后台管理登陆一直显示管理员密码错误?

有时浏览器缓存或Cookie可能导致登录问题。清除浏览器缓存和Cookie,或者尝试使用隐身模式或不同浏览器登录,排除浏览器相关问题。 1. 验证密码修改成功 如果你最近修改了密码,确保修改操作确实成功。通过主机提供商控制面板或直接在数据库中检查管理员用户的密码哈希值是否已…

网站被黑,现在登录后台密码错误。

处理网站被黑且后台密码错误的问题,建议按照以下步骤进行:确保安全立即断开受感染服务器的网络连接以防止进一步攻击。 检查是否有其他入口点(如FTP、SSH)也被攻破。评估损害审查日志文件(访问日志、错误日志等),确定入侵时间和方法。 使用文件完整性检查工具对比原始安…

网站后台显示用户名或密码错误,无法登录

当网站后台显示用户名或密码错误且无法登录时,可以按照以下逻辑步骤进行排查和处理:验证输入信息确认输入的用户名和密码是否正确,注意大小写敏感。 尝试使用其他已知正确的管理员账户登录。检查浏览器缓存和Cookie清除浏览器缓存和Cookie,或者尝试使用隐身模式或不同浏览器…

服务器重启后站点仍无法访问

服务器重启后,客户反馈网站仍然无法访问,应该如何处理? 答案:您好,建议您进行以下操作:检查网络连接: 断开并重新连接本地网络设备,确保网络畅通。 测试服务器端口: 测试80端口是否通畅,若仍无法访问,请提交工单至云服务器技术支持部门。非常感谢您的支持!由此给您…

域名状态为HOLD,如何解除?

问题:域名状态显示为HOLD,已经按要求上传资料并通过实名认证,但状态仍未更新。如何解除HOLD状态? 答案:您好,遇到域名状态为HOLD的情况,请联系域名管理机构或公安部电话专线(张警官),咨询申诉流程并说明情况。具体步骤如下:联系相关部门: 提供域名相关信息,申请解…

如何为域名及其二级域名添加HTTPS支持?

为域名及其二级域名添加HTTPS支持,可以按照以下步骤操作:购买SSL证书:选择合适的SSL证书类型(如单域名、通配符证书),并完成购买。 安装SSL证书:根据服务器类型(如Apache、Nginx),按照官方文档安装SSL证书。 配置强制HTTPS:在服务器配置文件(如.htaccess)中添加重…

当遇到无法删除FTP后台部分文件的问题时应采取哪些措施?

当您在尝试删除FTP后台中的某些文件时遇到了困难,这可能是由多种因素引起的。为了有效地解决问题,您可以按照以下步骤进行排查和处理:检查权限设置:首先要确认您是否拥有足够的权限来执行删除操作。有时候,文件夹或文件可能被设置了特定的访问权限,导致普通用户无法对其进…