【CH 5501】环路运输【DP】【单调队列】

【题解】CH5501 环路运输 单调队列+环形处理 题目链接 描述 在一条环形公路旁均匀地分布着N座仓库,编号为1~N,编号为 i 的仓库与编号为 j 的仓库之间的距离定义为 dist(i,j)=min⁡(|i-j|,N-|i-j|),也就是逆时针或顺时针从 i 到 j 中较近的一种。每座仓库都存有货物,其中编号为 i 的仓库库存量为 A_i。在 i 和 j 两座仓库之间运送货物需要的代价为 A_i+A_j+dist(i,j)。求在哪两座仓库之间运... 阅读详情

题目大意:

题目链接:http://contest-hunter.org:83/contest/0x50「动态规划」例题/5501 环路运输
n n n个在一个环上的仓库,两两之间运货的代价是 a [ i ] + a [ j ] + m i n ( ∣ i − j ∣ , ∣ n − ( i − j ) ∣ ) a[i]+a[j]+min(|i-j|,|n-(i-j)|) a[i]+a[j]+min(∣i−j∣,∣n−(i−j)∣)求最大代价。


思路:

环上的DP固然不好做,可以先把环拆成链,再拷贝一份。成为一条长度为 2 n 2n 2n的链。

for (int i=1;i<=n;i++)
{
	scanf("%d",&a[i]);
	a[i+n]=a[i];
}

那么接下来的DP就再链上DP就可以了。
首先对于两点的距离,取的是 a [ i ] + a [ j ] + m i n ( ∣ i − j ∣ , ∣ n − ( i − j ) ∣ ) a[i]+a[j]+min(|i-j|,|n-(i-j)|) a[i]+a[j]+min(∣i−j∣,∣n−(i−j)∣)。也就是环上顺时针和逆时针的距离的最小值。现在变成了链,就要发生改变。
很容易发现,顺时针和逆时针的最小值就是看看 ∣ i − j ∣ |i-j| ∣i−j∣是否超过了 n / 2 n/2 n/2,如果没有超过,那么肯定顺时针更优,否则逆时针更优。
那么将环拆成链之后,顺时针还是在原来的环上(即 i , j ≤ n i,j\leq n i,j≤n),就可以直接求出答案。否则 j j j就会超过 n n n。
如果是逆时针,那么链拷贝一份的作用求起到了。那么我们用 ∣ i − j ∣ |i-j| ∣i−j∣变成 ∣ j − i ∣ |j-i| ∣j−i∣,之后又知道 j = j + n j=j+n j=j+n,那么就有 ∣ i − j ∣ = ∣ j − i ∣ = ∣ j + n − i ∣ |i-j|=|j-i|=|j+n-i| ∣i−j∣=∣j−i∣=∣j+n−i∣。那么也变成了一条链。就可以求出答案了。时间复杂度 O ( n 2 ) O(n^2) O(n2)。
必须优化。我们发现要求最大值,那么就可以用单调队列优化,维护在区间范围内的最大值,每次至直接 O ( 1 ) O(1) O(1)求最大值即可。
时间复杂度 O ( n ) O(n) O(n)


代码:

#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;

int n,ans,a[2000011];
deque<int> q;

int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		a[i+n]=a[i];
		while (q.size()&&a[q.back()]-q.back()<a[i]-i) 
		 q.pop_back();
		q.push_back(i);  //先求出最开始的队列
	}
	for (int i=n+1;i<=n+n;i++)  //从n+1开始找
	{
		while (q.size()&&q.front()<i-n/2) q.pop_front();  //出了范围
		ans=max(ans,a[i]+a[q.front()]+i-q.front());
		while (q.size()&&a[q.back()]-q.back()<a[i]-i)   //保持单调
		 q.pop_back();
		q.push_back(i);
	}
	printf("%d\n",ans);
	return 0;
}
AcWing 289. 环路运输【环形DP + 单调队列优化】 在一条环形公路旁均匀地分布着N座仓库,编号为1~N,编号为 i 的仓库与编号为 j 的仓库之间的距离定义为 dist(i,j)=min⁡(|i-j|,N-|i-j|),也就是逆时针或顺时针从 i 到 j 中较近的一种。 每座仓库都存有货物,其中编号为 i 的仓库库存量为AiAi。 在 i 和 j 两座仓库之间运送货物需要的代价为Ai+Aj+dist(i,j)。 求在哪两座仓库之间运送货物... 阅读详情

相关推荐

环路运输(环形结构&&单调队列(滑动窗口))

在一条环形公路旁均匀地分布着N座仓库,编号为1~N,编号为 i 的仓库与编号为 j 的仓库之间的距离定义为 dist(i,j)=min⁡(|i-j|,N-|i-j|),也就是逆时针或顺时针从 i 到 j 中较近的一种。 每座仓库都存有货物,其中编号为 i 的仓库库存量为Ai。 在 i 和 j 两座仓库之间运送货物需要的代价为Ai+Aj+dist(i,j)。 求在哪两座仓库之间运送货物需要...

Mr_Kingk的博客 544

CH 5501 :环路运输(DP 环化处理)

题目大意:有一个圈上有n个点,编号从 1 ~ n,每个点有一个权值A[i],定义dist(i,j)=min(∣j−i∣,n−∣j−i∣)dist(i,j) = min(|j - i|,n - |j - i|)dist(i,j)=min(∣j−i∣,n−∣j−i∣),问两个点的A[i]+A[j]+dist(i,j)A[i] +A[j] + dist(i,j)A[i]+A[j]+dist(i,j)最大...

qq_41997978的博客 266

289. 环路运输 - AcWing 滑动窗口维护环形dp

289. 环路运输 - AcWing 题意 一个环形公路上有 nnn 个仓库,仓库之间的距离为两种走法的较小值,即 dis(i,j)=min(∣i−j∣,n−∣i−j∣)dis(i,j)=min(|i-j|,n-|i-j|)dis(i,j)=min(∣i−j∣,n−∣i−j∣) 。从仓库 iii 到仓库 jjj 的运输代价为 ai+aj+dis(i,j)a_i+a_j+dis(i,j)ai​+aj​+dis(i,j) 。 求最大的运输代价。 解法 首先考虑把环展开成链,再复制一段。即 ai+n=aia_{i

bandiaoz的博客 249

环路运输

在一条环形公路旁均匀地分布着N座仓库,编号为1~N,编号为 i 的仓库与编号为 j 的仓库之间的距离定义为 dist(i,j)=min⁡(|i-j|,N-|i-j|),也就是逆时针或顺时针从 i 到 j 中较近的一种。 每座仓库都存有货物,其中编号为 i 的仓库库存量为 Ai。 在 i 和 j 两座仓库之间运送货物需要的代价为 Ai+Aj+dist(i,j)。 求在哪两座仓库之间运送货物需要的代价...

sky123博客 719

稀疏阵列选型指南:互质阵、嵌套阵、MRA,谁才是你项目里的‘性价比之王’?

本文深入探讨了稀疏阵列技术中的互质阵、嵌套阵和MRA三大架构的工程化选型策略,重点分析了它们在DOA估计、自由度、旁瓣抑制和计算复杂度等核心指标上的表现。通过实际案例和配置示例,为智能天线、声学定位和毫米波雷达等应用场景提供技术选型指南,帮助研发团队在硬件成本与性能之间找到最佳平衡点。

weixin_42525005的博客 488

采购订单定价策略 超详细

‘需求’字段里填写的是一个例程编号(例程是一段判断程序),如果我们在需求中维护了例程编号,那只有这个例程条件被满足时,这个条件表才会被系统自动读取。一部分的条件表只有在凭证项目满足一定的条件时才会被读取。 ‘排斥的’字段如果别勾中的话,那表明如果这个条件表被系统成功读取到数据后,系统将停止这个存取顺序的执行,否则,系统将继续执行下去。 注意:a、如果我们给某个条件类型设定了有效期的话,那我们必须给这个条件类型分配一个存取顺序。 b、不能给一个抬头条件分配存取顺序。 是...

竹大的博客 1万+

AcWing 289. 环路运输,《算法竞赛进阶指南》,单调队列优化dp,滑动窗口求最大值,环形结构dp

在一条环形公路旁均匀地分布着 N 座仓库,编号为 1∼N,编号为 i 的仓库与编号为 j 的仓库之间的距离定义为 dist(i,j)=min(|i−j|,N−|i−j|),也就是逆时针或顺时针从 i 到 j 中较近的一种。每座仓库都存有货物,其中编号为 i 的仓库库存量为 Ai。在 i 和 j 两座仓库之间运送货物需要的代价为 Ai+Aj+dist(i,j)。求在哪两座仓库之间运送货物需要的代价最大。

Landing_on_Mars的博客 260

PIVlab软件入门:从GUI操作到2D2C粒子测速实战

本文详细介绍了PIVlab软件在2D2C粒子测速中的入门与实战应用。从GUI操作到环境搭建,再到图像预处理和核心参数设置,帮助用户快速掌握这一基于MATLAB的开源工具。通过实际案例和技巧分享,展示了PIVlab在流体力学实验中的高效性和实用性。

weixin_42547431的博客 226

【单调队列优化DP】CH 5501 环路运输

链接 http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%BE%8B%E9%A2%98/5501%20%E7%8E%AF%E8%B7%AF%E8%BF%90%E8%BE%93 大意 给定一个长度为nnn的环形序列aaa,定义dist(i,j)=...

Ajwallet 612

PMD相位偏折术实战:如何用Python处理条纹图,让金属外壳的划痕无处遁形

本文详细介绍了PMD相位偏折术在金属外壳划痕检测中的应用,通过Python实现条纹图处理和局部特征增强技术,显著提升微小缺陷的检出率。文章涵盖从四步相移条纹图采集到形状图局部增强的完整流程,特别适合工业质检场景,帮助实现高精度、高效率的自动化检测。

weixin_29291573的博客 508

硬件原理图分析

文章目录1 硬件原理图分析1.1 MCU部分1.2 NB部分1.3 电源部分 1 硬件原理图分析 1.1 MCU部分 MCU接口部分没啥需要注意,都是常规操作。 1.2 NB部分 U4是用来防静电的。 由于NB的以上几个引脚只支持1.8V,所以这里需要3.3V转1.8V的电路。只要把握住谁改变电平就好分析是怎么实现电平转换的了。 1.3 电源部分 图中的MOS是用来实现USB和电池同时插入时只能USB供电功能的。 ...

木子皿--啥都不会的菜鸟 8168

#单调队列,环形dp#CH 5501 环路运输

题目 编号为iii的仓库与编号为jjj的仓库之间的距离定义为 dist(i,j)=min(|i−j|,N−|i−j|)dist(i,j)=min⁡(|i−j|,N−|i−j|)dist(i,j)=min⁡(|i-j|,N-|i-j|),编号为iii的仓库库存量为AiAiA_i。在iii和jjj两座仓库之间运送货物需要的代价为Ai+Aj+dist(i,j)Ai+Aj+dist(i,j)A_i+A_...

lemondinosaur的博客 310

国内主流AI编程工具使用实例及总结

AI编程辅助工具是利用人工智能技术来帮助程序员进行软件开发的工具。它们可以在代码编写、代码审查、错误检测、代码优化等多个编程环节发挥作用,提高编程效率和代码质量。通义灵码,基于通义大模型的AI研发辅助工具,提供代码智能生成、研发智能问答、任务自主执行等能力,为开发者带来智能化研发体验,引领AI原生研发新范式。包含智能编码助手和AI程序员。

技术博客 1万+

Ch5501-环路运输【环形处理dp】

正题 题目链接:http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%BE%8B%E9%A2%98/5501%20%E7%8E%AF%E8%B7%AF%E8%BF%90%E8%BE%93 题目大意 有n座仓库,然后是一个环,两个仓库之间的运输...

QuantAsk 772

RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)

本文记录的是利用中的模块优化的目标检测网络模型。通过局部特征提取器、周围环境提取器、联合特征提取器和全局环境提取器来提取局部特征、周围环境和全局环境信息,充分利用不同层次的信息。本文将其应用到中,并进行二次创新,使网络能够更好的处理多类别目标的分类能力。CGNet: A Light-Weight Context Guided Network for Semantic Segmentation1️⃣ 首先通过局部特征提取器floc(∗)floc(*)floc(∗)和周围环境提取器fsur(∗)f_{sur }

Limiiiing的博客 1348

基于 Simulink 的 PFC + LLC 级联系统联合仿真与优化实战教程

摘要:本教程详细介绍了2kW级AC-DC变换器建模方法,采用"BoostPFC+LLC谐振变换器"组合架构。重点解析了双级系统的核心控制策略:前级BoostPFC实现功率因数校正(PF>0.95),后级LLC通过变频调制(PFM)实现高效能量传输。教程包含四大关键步骤:PFC建模与控制、LLC参数计算与实现、母线电容优化设计以及系统联合调试,特别针对级联系统常见的母线电容震荡问题提供了解决方案。同时给出了仿真波形分析指南和避坑建议,包括代数环处理、仿真步长设置等实用技巧,为新能源车

MHD0815的博客 118

AcWing 289. 环路运输

传送门 思路: 一个环路上的问题,考虑拆环为链然后复制一倍接在后面。那么对于Ai与Aj,不妨设j<i,如果i-j>N/2则两者距离在新的链上就是i-j,而如果i-j<=N/2那么两者之间的距离就是j+N-i=N-(i-j),而这个值<=N/2,所以二者的距离在新的链上一定不超过N/2。设新的链上两个物品为Ax与Ay,设y<x,可能的答案为Ax+Ay+x-y=Ax+x+Ay-y,所以我们可以枚举x,用单调队列维护一下Ay-y,其在队列内单调递减,就可以求出答案了。 代.

Prgl的博客 253

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

CH 5501 环路运输(环形结构上的dp)

题意:n个在一个环上的仓库,两两之间运货的代价是a[i]+a[j]+min(∣i−j∣,∣n−(i−j)∣) 求最大代价。 分析:《算法竞赛进阶指南》P297。 代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespa...

常胜将军的博客 344

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

CH P5501 环路运输

目录: 题目: 分析: 代码: 题目: 传送门 分析: 这道题可以发现是一个环,那么把环断成链,复制一份 同时可以发现如果i,ji,ji,j是最优解,那么j−i≤n÷2(j&amp;gt;i)j−i≤n÷2(j&amp;gt;i)j−i≤n÷2(j&gt;i) 所以可以用单调队列解决问题。时间复杂度O(n)O(n)O(n) 代码: #include&amp;lt;i...

qq_35786326的博客 432

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

[ch 5501]环路运输{单调队列,环形结构动态规划}

题目 http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%BE%8B%E9%A2%98/5501%20%E7%8E%AF%E8%B7%AF%E8%BF%90%E8%BE%93 解题思路 我们可以在任意位置把环断开,复制一倍接在末尾,形...

Nowed 842

【环形dp 单调队列】Contest Hunter_5501 环路运输

题意 给出一个环形的公路,上面有几个仓库,它们的存量为AiAiA_i,从仓库ii_i运输货物到仓库jj_j需要的代价为: Ai+Aj+dis(i,j){dis(i,j)=min(|i−j|,n−|i−j|}Ai+Aj+dis(i,j){dis(i,j)=min(|i−j|,n−|i−j|}A_i+A_j+dis(i,j) \{dis(i,j)=min(|i-j|,n-|i-j|\} 求出需要...

GOODPLACE 332

『环形处理』环路运输

题目描述 题解 一个非常显然的结论,如果我们要计算i-j(i<j)的答案: 如果i−j&gt;n2i-j&gt;\frac{n}{2}i−j>2n​,一定选择n−(i−j)=j+n−i.n-(i-j)=j+n-i.n−(i−j)=j+n−i.此时(j+n)−i&lt;n2(j+n)-i&lt;\frac{n}{2}(j+n)−i<2n​.此时相...

Ronaldo7_ZYB的博客 399

NOIP2015·洛谷·运输计划

洛谷P2680 运输计划 二分 + LCA + 树上差分

樱狸✨愿携清风归来处 362

洛谷 P4381 [IOI2008]Island

洛谷 P4381 [IOI2008]Island 题意 给出一个基环树森林,求所有基环树的直径的和。 解法 基环树可以看作一个环上连着很多小树,那么直径可能是小树的直径,也可能是两棵小树的深度之和加环上距离较大的部分。小树的直径可以在拓扑排序的时候维护好,ans1[v] = max({ans1[v], d[u] + d[v] + e.second, ans1[u]});,这样可以直接访问根,也就是环上的点来询问直径,后者需要在环上做dp,类似于 环路运输 ,并且这里求最大值,环的距离也是取最大值,所以可以不

bandiaoz的博客 562
上一篇: 【POJ 1456】Supermarket【并查集】
下一篇: 【POJ 3468】A Simple Problem with Integers【线段树】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值