题解:Luogu P11114 [ROI 2024] 小推车 (Day 1)

news/2025/11/9 18:52:49/文章来源:https://www.cnblogs.com/P2441M/p/19204688

题意

有一排编号为 \(1\sim n\) 的座位。有 \(k\) 种饮料,第 \(i\) 名乘客想要喝第 \(a_i\) 种饮料。小推车需要从 \(0\) 位置出发,最终走到 \(n+1\) 位置,按顺序给每名乘客分饮料。推车上有 \(m\) 个瓶子,每个瓶子可以装 \(p\) 个单位的某一种饮料。推车行进过程中可以回储藏室给空瓶子补充饮料,储藏室可能位于 \(0\) 位置,或 \(n+1\) 位置,或两边都有。在补充饮料后,小推车应该回到第一个未提供饮料的乘客的位置。小推车初始时可以装饮料。求小推车从 \(0\) 走到 \(n+1\),使得每名乘客都能分到饮料的最小总移动距离。\(3\leq n\leq 10^6\)\(1\leq p\leq 10^6\)\(1\leq a_i\leq k\leq m\leq 10^6\)

题解

NOIP 模拟赛 T3。赛时做出来了,因为一些细节挂了 \(22\) 分。

显然考虑 DP。令 \(f_i\) 表示考虑了前 \(i\) 个人,强制在 \(i\) 处分完饮料后补充饮料,然后回到 \(i+1\) 处的最小距离。枚举 \(j\) 表示上一次在 \(j-1\) 处补充饮料,那么转移就是 \(f_i\gets\min(f_i,f_{j-1}+i-j+dis_i)\),其中 \(dis_i\) 表示从 \(i\) 走到最近的储藏室再回到 \(i+1\) 所走的距离。那么问题转化成判定在 \(j-1\) 处补充饮料后,能否在中途不补充饮料的情况下走完 \([j,i]\)

我们每次只能给空瓶子补充饮料,乍一看有点棘手。不妨对着一种饮料考虑,我们显然可以把策略固定为:每次从所有装着该饮料的瓶子中选择唯一的不是满瓶的那个,若都是满瓶则任选一瓶。我们发现策略固定后,不管何时补充饮料,在某个固定的座位分这种饮料时,对应的饮料瓶内的饮料量是已知的

这样性质就很好了,我们可以做一些静态的预处理。令 \(g_i\) 表示前 \(i\) 个人需要开多少瓶饮料,\(h_i\) 表示前 \(i\) 个人能喝完多少瓶饮料。那么在 \(j-1\) 处回储藏室时,有 \(g_{j-1}-h_{j-1}\) 个瓶子是不能补充饮料的,而从 \(j\) 走到 \(i\) 的过程中会喝完 \(g_i-g_{j-1}\) 瓶饮料,于是我们的判定条件实际上就是 \(g_{j-1}-h_{j-1}+g_i-g_{j-1}=g_i-h_{j-1}\leq m\)

这样我们就能得到 \(\mathcal{O}(n^2)\) 的做法了。

优化是容易的,很显然 \(g,h\) 都单调不减,因此随着 \(i\) 递增,\(j\) 的取值区间的左右端点都单调不减,所以直接使用单调队列即可优化至 \(\mathcal{O}(n)\)

代码
#include <bits/stdc++.h>using namespace std;#define lowbit(x) ((x) & -(x))
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
const int N = 2e6 + 5;
const ll INF = 2e18;template<typename T> inline void chk_min(T &x, T y) { x = min(x, y); }
template<typename T> inline void chk_max(T &x, T y) { x = max(x, y); }int n, m, k, p, c, cnt[N];
int g[N], h[N];
int hd, tl, q[N];
ll f[N];inline int getd(int x) {if (x == n + 1) return 0;if (c == 1) return (n - x) * 2 + 1;if (c == 2) return x * 2 + 1;return min(x * 2 + 1, (n - x) * 2 + 1);
}int main() {ios::sync_with_stdio(0), cin.tie(0);cin >> n >> m >> k >> p >> c;for (int i = 1, x; i <= n; ++i) {cin >> x;g[i] = g[i - 1], h[i] = h[i - 1];if (!cnt[x]++) ++g[i];if (cnt[x] == p) cnt[x] = 0, ++h[i];}f[0] = 1, g[n + 1] = g[n];q[hd = tl = 1] = 0;for (int i = 1; i <= n + 1; ++i) {int d = getd(i);while (hd <= tl && g[i] - h[q[hd]] > m) ++hd;if (hd <= tl) f[i] = f[q[hd]] - q[hd] - 1 + d + i;while (hd <= tl && f[q[tl]] - q[tl] - 1 >= f[i] - i - 1) --tl;q[++tl] = i;}cout << f[n + 1];return 0;
}

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

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

相关文章

摸鱼笔记[1]-windows设置双网卡优先级(跃点数)

windows系统通过设置跃点数以设置双网卡优先级, 实现工控局域网网卡和互联网网卡各司其职, 电脑同时访问局域网和互联网.摘要 windows系统通过设置跃点数以设置双网卡优先级, 实现工控局域网网卡和互联网网卡各司其职,…

NXP - 用MDK建立基于arm-none-eabi软件链的工程框架

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

用 OKHttp 和 Retrofit 打造稳如磐石的网络请求:连接池与重试机制的实战指南 - 教程

用 OKHttp 和 Retrofit 打造稳如磐石的网络请求:连接池与重试机制的实战指南 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

数字孪生重构智慧园区:众趣科技何以成为 VR 园区领域标杆 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

电脑监控软件,后台监控,千里眼监控

电脑监控软件,后台监控,适合家庭电脑、员工电脑监控 支持异地远程访问,终身授权最低100R,可月付年付 不限设备数量,支持win7、10、11 1、电脑位置显示 2、桌面远程观看 3、桌面文件下载 4、完整记录按键输入 5、智…

【URP】Unity[后处理]运动模糊MotionBlur

Motion Blur 概念与作用 Motion Blur(运动模糊)是一种模拟真实相机在拍摄快速移动物体或自身移动时产生的模糊效果的后处理技术。它通过模糊图像中运动物体的轨迹,增强动态场景的真实感和【从UnityURP开始探索游戏渲…

go sync.pool 学习笔记

概述 sync.pool 对象池可以用来复用临时对象,减少内存压力,降低 GC 压力。 示例 基本用法 type Worker struct{} func (w *Worker) Name() string { return "worker" } func main() { workerPool :…

初识分布式训练

假设有N块GPU,模型有ψ个参数。 前提知识:每个参数对应一个梯度值,且SGD每个参数对应一个一阶动量,Adam每个参数对应一个一阶、一个二阶动量DP(data parallel) ​ 数据并行(单进程,多线程,只用一个cpu核),每…

电脑监控软件,后台监控,适合家庭电脑、员工电脑监控

电脑监控软件,后台监控,适合家庭电脑、员工电脑监控 支持异地远程访问,终身授权,可月付年付 不限设备数量,支持win7、10、11 1、电脑位置显示 2、桌面远程观看 3、桌面文件下载 4、完整记录按键输入 5、智能屏幕快…

题解:P10856 【MX-X2-T5】「Cfz Round 4」Xor-Forces

题解 首先,我们先考虑简单的情况,没有修改操作。 由题意得,一段区间颜色段个数可以转化为区间长度减去相邻同色个数,即区间 \([l,r]\) 的颜色段数为 \(r-l+1- \sum^r_{i=l+1}[a_i=a_{i-1}]\)。 考虑线段树,那么一…

python: Virtualenv的安装与应用

一,安装Virtualenv 以ubuntu为例: 安装pip # apt install python3-pip 安装virtualenv # apt install python3-virtualenv二,创建环境 $ virtualenv -p /usr/bin/python3.12 myenv 三,进入/退出 环境 进入 $ sourc…

题解:AT_abc147_f [ABC147F] Sum Difference

题意 在一个等差数列中取出若干个元素,求取出的元素与未取出的元素的差值有多少种可能。 思路 首先,我们有一个式子: \[w(i)=\sum_{i \in S}A_i-\sum_{i \notin S}A_i \]不难看出,该式可以变为: \[w(i)=2\times \…

20231326《密码系统设计》第八周预习报告

20231326《密码系统设计》第八周预习报告 目录20231326《密码系统设计》第八周预习报告学习内容《Windows C/C++加密解密实战》第 12 章1. 什么是 SSL 协议 (Secure Sockets Layer)2. SSL/TLS 协议发展历程3. SSL v3/T…

PERL Docker 容器化部署指南

PERL(Practical Extraction and Reporting Language)是一种高级、通用、解释型、动态编程语言,其语法借鉴了C、Shell脚本、AWK和sed等多种语言特性,广泛应用于系统管理、Web开发、网络编程等领域。通过Docker容器化…

解放双手!使用Roslyn生成代码让你的 HTTP 客户端开发变得如此简单

在现代 .NET 开发中,源代码生成器(Source Generators)是一项强大的功能,它允许开发者在编译时自动生成代码,从而减少样板代码的编写,提高开发效率和代码质量。本文主要介绍使用Roslyn实现两个代码生成器:HttpCl…

pandoc用法

要将你的 `文件V5.0_2.docx` 文件转换为 Markdown 格式,使用 **Pandoc** 是一个非常直接的选择。我已经为你准备好了相应的命令,并补充了一些实用技巧。 ### 📝 核心转换命令 在终端或命令行中,导航到你的 `.docx…

JMeter:性能测试利器全解析 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

251109

JT-JY13T1S1Hello, Tourist information center, Mike speaking, how can i help you? Hi, i want to find out about cockery classes. I believe there is some one-day calsses for tourists. Well, they are open…

electron-vite为linux打包成功,但是安装后运行无反应

属于shark插件没有运行 在代码中使用动态导入,如果导入成功就使用shark压缩,如果没有就不压缩。 `// 动态导入 sharp,如果加载失败则优雅降级 let sharp: any = null let sharpAvailable = false async function lo…