当前位置: 首页 > 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.gsyq.cn/news/75750.html

相关文章:

  • 2025 Newest Autel BMW G-Chassis IMMO Add Key (1-Year License) for IM508/IM608/IM1/IM2
  • Go 1.25 发布:性能、器具与生态的全面进化
  • 实用指南:OSG多视口与多通道渲染核心技术解析
  • P8313 [COCI 2021/2022 #4] Izbori
  • 2025 最新智能制造服务商 / 厂家 TOP5 评测!科技赋能 + 全周期服务权威推荐榜单发布,引领智慧工厂建设新生态
  • CF762E Radio stations
  • 【拓补排序 TB_sort】P4017 最大食物链计数
  • 2025年深圳AI搜索排名优化公司推荐
  • Easysearch 2.0.0 性能测试
  • 基于STM32标准库的FreeRTOS移植与任务创建 - 详解
  • 2025 最新工业机器人应用服务商 / 厂家 TOP5 评测!科技赋能 + 全生命周期服务权威榜单发布,重构智能制造生态
  • Launch X431 PRO3 V+ Elite: Bi-Directional, ECU Coding Topology Mapping for Euro/Amer Vehicles
  • linux单用户模式
  • 吉他自学笔记
  • 为全球宝宝选对营养:央视关注+进博亮相,德国安心之选inne
  • 2025 年 12 月法兰保护罩厂家权威推荐榜:阀门保温罩/法兰防溅罩/法兰保护套,专业防护与耐用品质深度解析
  • openEuler:构建AI原生操作系统的架构演进与实践路径
  • FFmpeg开发笔记(九十二)基于Kotlin的开源Android推流器StreamPack
  • Microsoft Visual Studio 2010 TFS强制解除签出
  • HTTP/2在EDI领域中的优势:构建高效、安全、现代化的数据交换基石 - 详解
  • why Picograph can not learn English by translator
  • cursor
  • openEuler 软件生态多元适配评测:分布式存储与大数据组件实战验证
  • 短视频矩阵架构搭建指南:源码部署与全流程解析
  • 完整教程:Docker学习笔记---day001
  • 2025年度靠谱的实验室反应釜厂家TOP5权威推荐
  • 基于Python+Vue开发的婚恋交友管理系统源码+运行步骤+计算机专业
  • Python线程指南
  • 【基础】Unity着色器编程的语言和数学基础介绍
  • 2025年评价高的Q235模具钢/模具钢45#锯切厂家最新权威推荐排行榜