【luogu题解】P9749 [CSP-J 2023] 公路
\(Meaning\)

\(Solution\)
这道题我来讲一个不一样的解法:\(dp\)
在写 \(dp\) 之前,我们需要明确以下几个东西:状态的表示,状态转移方程,边界条件和答案的表示。
状态的表示
\(dp[i]\) 表示到达第 \(i\) 个站点所需要的最少钱数, \(w[i]\) 表示在使用最少钱数到达第 \(i\) 个站点时多余的路程。
状态转移方程
dp[i]=dp[i-1]+\bigg\lceil\frac{v[i-1]-w[i-1]}{d}\bigg\rceil\times pre\_min(i-1)
\]
w[i]=\bigg\lceil\frac{v[i-1]-w[i-1]}{d}\bigg\rceil-v[i-1]+w[i-1]
\]
其中 \(pre\_min(i)\) 表示前 \(i\) 个站点中最小的油价。
边界条件
dp[i]=0,w[i]=0
\]
答案的表示
dp[n]
\]
问题
在状态转移方程中,怎样在 \(O(1)\) 的时间复杂度下完成 \(pre\_min\) 函数呢?
这就涉及到了一个算法:
\(ST\) 表
在算法和数据结构中,ST表(Sparse Table)是一种用于解决区间查询问题的数据结构。它可以有效地回答各种形式的查询,例如最小值、最大值、区间和等。
简介
ST表的主要思想是通过预处理来加速区间查询。它使用倍增 DP 的思想将一个数组分割成多个子区间,并在每个子区间上计算出某种操作的结果。然后,根据这些预先计算好的结果,我们可以根据需要合并区间来回答各种查询。
具体的实现过程如下:
- 初始化ST表,ST表是一个二维数组。
- 将输入的原始数组填充到ST表的第一行。
- 使用递推关系填充ST表的其他行,直到得到完整的ST表。
- 根据查询的起始位置和区间长度,在ST表中找到对应区间的值,结合适当的操作得出最终结果。
查询操作
对于任何查询操作,我们可以使用以下步骤来回答:
计算出查询区间的长度len。
找到大于等于len的最大值j,使得2^j <= len。
使用预处理的结果和递推关系,在ST表中找到对应的值,并结合适当的操作得到查询结果。
这种方法的时间复杂度为O(1),因为我们只需进行几次常数级别的操作即可回答查询。
应用场景
ST表在解决各种区间查询问题时非常有用。以下是一些常见的应用场景:
- 查询最小值/最大值:通过选择适当的查询操作,在O(1)的时间复杂度内回答每个查询。
- 区间和查询:可以通过使用累积和来实现区间和查询。
- 区间gcd查询:可以通过预处理和递推关系计算区间内的最大公约数。
总结
ST表是一种高效解决区间查询问题的数据结构。通过预先计算和递推关系,我们可以在O(1)的时间复杂度内回答各种形式的查询。它的实现相对简单且灵活,适用于多种应用场景。
模板
初始化(时间复杂度 \(O(\log_2n)\) )
for(int i=1;i<=n;i++) {
st[i][0]=a[i];
}
for(int j=1;(1<<j)<=n;j++) {
for(int i=1;i+(1<<j)-1<=n;i++) {
st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
查询(时间复杂度 \(O(1)\) )
l=1,r=i-1,len=log2(r-l+1);
pm=min(st[l][len],st[r-(1<<len)+1][len]);
解决问题
有了ST表,我们就可以在O(1)的时间复杂度中查询最值了,那我们程序的最终问题:TLE也解决了。程序整体时间复杂度为O(n),可以通过此题。
AC代码如下。
\(Accept\ Code\)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+5;
ll v[N],a[N],w[N],dp[N],st[N][20];
ll n,d,l,r,len,pm;
int main() {
cin>>n>>d;
for(int i=1;i<n;i++) {
cin>>v[i];
}
for(int i=1;i<=n;i++) {
cin>>a[i];
}
for(int i=1;i<=n;i++) {
st[i][0]=a[i];
}
for(int j=1;(1<<j)<=n;j++) {
for(int i=1;i+(1<<j)-1<=n;i++) {
st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
for(int i=2;i<=n;i++) {
l=1,r=i-1,len=log2(r-l+1);
pm=min(st[l][len],st[r-(1<<len)+1][len]);
dp[i]=dp[i-1]+ceil(1.0*(v[i-1]-w[i-1])/d)*pm;
w[i]=ceil(1.0*(v[i-1]-w[i-1])/d)*d-(v[i-1]-w[i-1]);
}
cout<<dp[n];
return 0;
}
【luogu题解】P9749 [CSP-J 2023] 公路的更多相关文章
- luogu题解P2312解方程--暴力模+秦九韶
题目链接 https://www.luogu.org/problemnew/show/P2312 分析 这道题很毒啊,这么大的数. 但是如果多项式\(\sum_{i=0}^N a[i]*X^i=0\) ...
- CSP J/S 初赛总结
CSP J/S 初赛总结 2021/9/19 19:29 用官方答案估计 J 涂卡的时候唯一的一支 2B 铅笔坏了,只能用笔芯一个个涂 选择 \(-6\ pts\) 判断 \(-3\ pts\) 回答 ...
- 2019 CSP J/S第2轮 视频与题解
CSP入门组和提高组第二轮题解 转自网络
- luogu题解 P2886 【牛继电器Cow Relays】-经过K边最短路&矩阵
题目链接: https://www.luogu.org/problemnew/show/P2886 Update 6.16 最近看了下<算法导论>,惊奇地发现在在介绍\(APSP\) \( ...
- luogu题解P1967货车运输--树链剖分
题目链接 https://www.luogu.org/problemnew/show/P1967 分析 NOIp的一道裸题,直接在最大生成树上剖分取最小值一下就完事了,非常好写,常数也比较小,然而题解 ...
- luogu题解 P3763 【[TJOI2017]DNA】
题目链接: https://www.luogu.org/problemnew/show/P3763 思路: 首先我们要用到Rabin-Karp哈希,其实就是这个: 若\(w_{str}\)=(\(a_ ...
- luogu题解 P3629 【[APIO2010]巡逻】树的直径变式
题目链接: https://www.luogu.org/problemnew/show/P3629 分析 最近被众多dalao暴虐,这道题傻逼地调了两天才知道错哪 不过这题比较良心给你一个容易发现性质 ...
- luogu题解P4198楼房重建--线段树神操作
题目链接 https://www.luogu.org/problemnew/show/P4198 分析 一句话题意,一条数轴上有若干楼房,坐标为\(xi\)的楼房有高度\(hi\),那么它的斜率为\( ...
- luogu题解P2502[HAOI2006]旅行--最小生成树变式
题目链接 https://www.luogu.org/problemnew/show/P2502 分析 一个很\(naive\)的做法是从\(s\)到\(t\)双向BFS这当然会TLE 这时我就有个想 ...
- luogu题解P1032字串变换--BFS+STL:string骚操作
题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的strin ...
随机推荐
- vlan与单臂路由
vlan 1,什么是vlan vlan叫做虚拟局域网 (VLAN, Virtual LAN) 虚拟局域网(VLAN)是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制,可以根据功能.部门及应 ...
- 《深入理解Java虚拟机》读书笔记:Class类文件的结构
Class类文件的结构 Sun公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的的程序存储格式--字节码(ByteCode),从而实现了程序 ...
- Netease研发实习生一面
最想去的公司和部门..今天终于面了,感觉跪了..实质性的问题的确打得不好..庆幸的是拿到了B公司的offer,实习是不愁了.. 记下问题,希望对之后的同学有一定帮助. 问的问题总结: 1.进程线程协程 ...
- The Missing Semester - 第五讲 学习笔记(二)
第五讲(二) SSH入门 介绍完命令行环境后,这半节主要介绍的是ssh的有关入门知识.SSH是Secure Shell的简称. 课程视频地址:https://www.bilibili.com/vide ...
- 小知识:vi如何使用列编辑模式快速插入
经常需要用到列编辑这种操作,现在很多超文本的编辑器都可以轻松实现. 但有时需要在vi界面直接使用,但是vi的列编辑操作因不常使用总是忘记现查. 这次干脆记录下加深印象. vi编辑某个文本时,比如修改一 ...
- jenkin部署(docker+gitlab)
第一部分 安装部署 1.1 gitlab安装部署 最小配置 内存至少4g,系统内核至少在3.10以上 uname -r 可查看系统内核版本 默认docker已经安装 1.安装gitlab 127机器 ...
- Vite+ts+springboot项目集成2
项目集成 集成element-plus 官网地址: 安装图标库 pnpm install element-plus @element-plus/icons-vue 入口文件main.ts全局安装ele ...
- oracle 问题:ORA-28040:没有匹配的验证协议
Oracle11g客户端连接Oracle12C服务器端,需配置项 前置条件:已安装Oracle11g客户端,配置好环境变量,用PL/SQL Developer登录数据库 出现问题:登录数据库时,提示& ...
- vue上通过krpano.js实现360全景图
首先贴出一些XML对应的函数,文件内容都有注释说明, 前端代码读取xml文件代码 // 初始化 window.embedpano({ xml: 0, target: 'pano', html5: 'o ...
- QUERIES
这个题解..u1s1我没看懂,但是我觉得这里面有一个重要的思想就是对于像异或这种最终值只是看一个数位的问题,我们可以考虑分解,把每一个子问题单独解决就可以了其实更难的应该是每个子区间的异或和之和这个方 ...