首页 > 其他分享 >「PR #12」电塔

「PR #12」电塔

时间:2024-02-25 21:12:01浏览次数:19  
标签:PR 12 前缀 电塔 拐点 斜率 最小值 单调

首先考虑小小地转化题意:我们知道第 \(i\) 座电塔的终点 \(y_i\) 必然大于等于 \((i-1)d\),并且 \(y_i-(i-1)d\) 是单调不降的。所以我们将 \(x_i\leftarrow x_i-(i-1)d\) 然后求一个单调不降的非负整数序列 \(a\) 并最小化 \(\sum\limits_{i=1}^n|x_i-a_i|\)。这是一个经典题。我们考虑如下做法(下面部分翻译自洛谷题解):

令 \(f_{i,j}\) 表示选了前 \(i\) 个数,并且第 \(i\) 个数小于等于 \(j\) 时的前 \(i\) 项之和的最小值。那么转移时这样的:

  • \(f_{i,j}\leftarrow f_{i-1,j}+|x_i-j|\)。

  • 对 \(f_{i,j}\) 取前缀最小值。

那么实际上我们的 \(f_{i,j}\) 是关于 \(j\) 的单调不增函数,并且斜率单调不减,且最大斜率必然为 \(0\)。

那么考虑对这样的一个函数维护其所有拐点(为了方便,我们将不存在的斜率也维护一下拐点,例如 \(9,6,5\) 我们将第二个数同时看作 \(-3\) 到 \(-2\) 的拐点与 \(-2\) 到 \(-1\) 的拐点),然后考虑加上一个绝对值函数,并取前缀最小值所带来的影响。

加上绝对值函数,我们只需要在拐点集合里加入两个 \(x_i\) 即可。然后取前缀最小值就是把最后一段斜率为 \(1\) 的推平,也就是去掉最大的拐点。发现拐点集合用 STL 就可以维护了。至于考虑答案,我们在最后取出最大拐点,这一定是 \(a_n\) 的值。然后我们再推出 \(a_{n-1}\) 的值,这个可以比较 \(a_n\) 与上一次最大拐点的值的较小者就可以了。总复杂度 \(\mathcal O(n\log n)\)。注意细节,因为是非负整数,所以要注意一下 \(x_i<0\) 的情况。

标签:PR,12,前缀,电塔,拐点,斜率,最小值,单调
From: https://www.cnblogs.com/tulipenoire/p/18033058

相关文章

  • 2.12
    JavaScript对象在JavaScript中,几乎所有的事物都是对象。 在JavaScript中,对象是非常重要的,当你理解了对象,就可以了解JavaScript。 你已经学习了JavaScript变量的赋值。以下代码为变量 car 设置值为"Fiat":var car= "Fiat";对象也是一个变量,但对象......
  • Programming Abstractions in C阅读笔记:p293-p302
    《ProgrammingAbstractionsinC》学习第73天,p293-p302总结,总计10页。一、技术总结1.时间复杂度(1)quadratictime(二次时间)p293,AlgorithmslikeselectionsortthatexhibitO(N^2)performancearesaidtoruninquadratictime。2.线性查找(linearsearch)p293,B......
  • Java基础12:JavaDoc生成文档
    JavaDoc1.javadoc命令是用来生成自己API文档的2.参数信息2.1@author作者名2.2@version版本号2.3@since指明需要最早使用的jdk版本2.4@param参数名2.5@return返回值情况2.6@throws异常抛出情况 ......
  • HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)
    HUAWEIProgrammingContest2024(AtCoderBeginnerContest342)A-Yay!代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=p......
  • Graph-Skeleton: ~1% Nodes are Sufficient to Represent Billion-Scale Graph
    目录概符号说明EmpiricalAnalysisSkeletonGraphNodeFetchingGraphCondensation代码CaoL.,DengH.,WangC.,ChenL.andYangY.Graph-skeleton:~1%nodesaresufficienttorepresentbillion-scalegraph.WWW,2024.概本文提出了一种图压缩的方法,这些方法基......
  • Linux离线部署SpringBoot前后端分离项目
    本文介绍了在内网下的纯离线环境中部署SpringBoot前后端分离项目,由于是个前端仔,并未接触过linux,在经历诸多错误和踩坑之后,终于部署成功(大哭),在此记录一下。工具选择选择合适的工具进行远程连接,如Xshell、Xftp、putty、Terminus等Xshell:连接远程服务器的命令终端Xftp:连接远......
  • 依赖注入(Dependency Injection, DI)是一种设计模式,例如,在React中,父组件可以通过props向
    依赖注入renderprops其实就是React世界中的“依赖注入”(DependencyInjection)。所谓依赖注入,指的是解决这样一个问题:逻辑A依赖于逻辑B,如果让A直接依赖于B,当然可行,但是A就没法做得通用了。依赖注入就是把B的逻辑以函数形式传递给A,A和B之间只需要对这个函数......
  • 《程序是怎样跑起来的》第12章读书笔记
    来到了这本书的最后一章。如何让计算机学习,那么什么是机器学习机器学习指的是让计算机这种机器来学习。在机器学习中程序员只编写用于学习的程序。这个程序的内容是让计算机读取大量的数据,然后学习这些数据的特征并生成一个识别模型这里模型指的是识别机制。机器学习也有很多方法......
  • 3代 I3 3220 对比12代 G6900 测试
    3代I33220对比12代G6900测试I33220的CPU-Z,和cinebenchr23跑分。G6900的CPU-Z,和cinebenchr23跑分。 I33220 CPU-Z单核:300,多核心:827.R23 单核:639,多核心:1557. G6900CPU-Z单核:541,多核心:1057.R23 单核:1271,多核心:2444. END ......
  • 第12章让计算机思考的程序实现方式
    程序的使用目的:大致可以划分为作为工具与代替执行人类思考两类1工具类:如文字处理器,excel等程序主要用于作为工具提升工作效率2代替人类思考类:如微计算机控制电饭煲,根据米和水的分量自动调节火的大小与加热时间常见用程序表示人类的思考方式:1随机性,用于模仿人思考的随意性,没有......