当前位置: 首页 > news >正文

P10602 [CEOI 2009] Harbingers

洛谷

我们可以考虑使用动态规划来解决。

在线性情况下,我们可以直接将状态设为 \(dp_i\) 表示走到 \(i\) 号点的时候的最小路程。

可以得到状态转移方程:

\[$ dp_i=\min(dp_j+(l_i-l_j)\times v_i+s_i) $\]

其中 \(l_i\) 表示 \(i\) 号点到根节点的距离,可以直接预处理或者在深搜时处理。

此时我们的时间复杂度是 \(O(n^2)\) 无法通过,而且还需要转化为树状。

先考虑如何减小时间复杂度,我们会发现这条式子明显可以使用斜率优化。

由于每个节点选择值不具有单调性,我们不考虑使用单调队列,而是选择单吊栈和二分。

接着我们需要转为树状图,只需要在每一个节点的查询结束以后,将这个栈改为原本的情况即可。

但是由于我们维护的是一个单调栈,所以可能被删掉的数量会比较多,可能会超时。

所以我们再在单调栈里面二分出要删掉的位置,同时修改要修改位置的值和长度,并将被修改的值和原长度记录下来。

在回溯时,我们只需要再次修改长度和这个位置的值即可。

也就是说原数字仍然保留在栈中,但是不在范围内,所以不需要重新赋值。

最后注意在比较斜率时可能会超过爆掉。

代码:

/*
dp[i]=min(dp[j]+(l[i]-l[j])*v[i])+s[i]
x<y
y better
dp[x]-l[x]*v[i]>dp[y]-l[y]*v[i]
Y[x]=dp[x]
X[x]=l[x]
*/
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,st[100005],top,s[100005],v[100005],dp[100005],x[100005],y[100005],l[100005],b[100005];
struct P{int x,y;
};
vector<P> e[100005];
bool check(int i,int j,int k){return (__int128)(y[i]-y[j])*(x[j]-x[k])<=(__int128)(y[j]-y[k])*(x[i]-x[j]);
}
int calc(int i,int j){return dp[j]+(l[i]-l[j])*v[i]+s[i];
}
pair<int,int> push(int x){int now=top,tmp,l=1,r=top;while(l<r){int mid=l+r>>1;if(check(x,st[mid+1],st[mid]))r=mid;else l=mid+1;}top=l;tmp=st[++top],st[top]=x;return {now,tmp};
}
void reset(int x,int y){st[top]=y;top=x;
}
int find(int v){int l=1,r=top;while(l<r){int mid=l+r>>1;if(calc(v,st[mid])>=calc(v,st[mid+1]))l=mid+1;else r=mid;}return st[l];
}void dfs(int p,int fa,int sum){l[p]=sum;dp[p]=calc(p,find(p));x[p]=l[p];y[p]=dp[p];pair<int,int> tmp2=push(p);for(P i:e[p])if(i.x!=fa)dfs(i.x,p,sum+i.y);reset(tmp2.first,tmp2.second);
}
signed main(){cin>>n;for(int i=1,a,b,c;i<n;i++){cin>>a>>b>>c;e[a].push_back({b,c});e[b].push_back({a,c});}for(int i=2;i<=n;i++)cin>>s[i]>>v[i];dfs(1,0,0);for(int i=2;i<=n;i++)cout<<dp[i]<<' ';return 0;
}
http://www.jsqmd.com/news/65209/

相关文章:

  • 2025 Newest Autel BMW G-Chassis IMMO Add Key (1-Year License) for IM508/IM608/IM1/IM2
  • Go 1.25 发布:性能、器具与生态的全面进化
  • P6173 [USACO16FEB] Circular Barn P
  • 为数字文明奠基:论通译院-价值星图-叙事舞台架构作为价值实践的元操作系统
  • 实用指南:OSG多视口与多通道渲染核心技术解析
  • P8313 [COCI 2021/2022 #4] Izbori
  • 汽车智能座舱软件、技术、分类介绍
  • 2025 最新智能制造服务商 / 厂家 TOP5 评测!科技赋能 + 全周期服务权威推荐榜单发布,引领智慧工厂建设新生态
  • 『NAS』在群晖部署图表绘制工具-Draw.io
  • CF762E Radio stations
  • grep 常用功能
  • 2025 最新工业自动化服务商 / 厂家 TOP5 评测!科技赋能 + 全周期服务权威榜单发布,引领智慧工厂建设新生态
  • 2025 最新智慧工厂建设服务商/厂家 TOP5 评测!科技赋能+全周期服务权威推荐榜单发布,引领智能制造新生态
  • why windows is worst
  • 4pcs Launch LTR-05 TPMS Sensor Tool 315MHz 433MHz - Metal/Rubber for European/American Cars
  • Get Lifetime Free Launch X431 ADAS Calibration for PAD VII/Pro5/Pro3S+/Pro3/APEX
  • 儿童补钙不盲选!从钙源到配方,儿童钙剂选购全指南
  • 2025年ChatGPT优化排名公司推荐:AI驱动下的SEO新选择
  • 【拓补排序 TB_sort】P4017 最大食物链计数
  • 2025年深圳GEO优化公司推荐:AI驱动时代的流量突围伙伴
  • 2025年11月儿童营养品牌测评指南——选对不踩坑
  • 2025年深圳AI搜索排名优化公司推荐
  • 【AI大模型技术】2.神经网络 - 教程
  • P3120 [USACO15FEB] Cow Hopscotch G
  • Easysearch 2.0.0 性能测试
  • ABC435
  • 散修带你入门鸿蒙应用开发基础:启程篇(上) - 鸿蒙
  • PowerShell TOTP 身份验证器
  • 分库分表是同一个实例内的多个不同库/不同表吗
  • 基于STM32标准库的FreeRTOS移植与任务创建 - 详解