【题解单调队列优化dp】划分

划分

在这里插入图片描述


分析:

首先,我们目光着眼于部分分
我们尝试用 O ( n 3 ) O(n^3) O(n3)的朴素dp去解决这个问题
f [ i ] [ j ] 表示划分到第 i 个位置,且上一个位置是 j 的最小运行时间是多少 f[i][j]表示划分到第i个位置,且上一个位置是j的最小运行时间是多少 f[i][j]表示划分到第i个位置,且上一个位置是j的最小运行时间是多少
然后按照常规思路,我们就枚举上一个端点和上上端点
f [ i ] [ j ] = M i n ( f [ j − 1 ] [ k ] + ( s [ i ] − s [ j − 1 ] ) 2 ) ( 当且仅当 s [ i ] − s [ j − 1 ] > = s [ j − 1 ] − s [ k − 1 ] ) f[i][j]=Min(f[j-1][k]+(s[i]-s[j-1])^2)(当且仅当s[i]-s[j-1]>=s[j-1]-s[k-1]) f[i][j]=Min(f[j1][k]+(s[i]s[j1])2)(当且仅当s[i]s[j1]>=s[j1]s[k1])

但是,我们真的需要枚举每一个端点吗?

我们知道,完全平方有一个美妙的特性: a 2 + b 2 < = ( a + b ) 2 a^2+b^2<=(a+b)^2 a2+b2<=(a+b)2
对于这道题而言,就是说,如果有两段,这两段的存在是合法的,那么就没必要将他们合成一段去处理
换句话说,划分方案一定是段数越多越优。
那么上面的dp,还有必要去枚举每一个端点吗?
显然是不要的,应用那个性质,我们只需要取找离i最近的满足 s [ j − 1 ] − s [ k − 1 ] < = s [ i ] − s [ j − 1 ] s[j-1]-s[k-1]<=s[i]-s[j-1] s[j1]s[k1]<=s[i]s[j1]的那个j和k即可。
枚举完j之后,我们想要找k有两种方法,第一种就是直接二分,第二种就是直接用一个数组 L a [ j ] La[j] La[j]去记录可以转移到j的最近的位置(由于是越近越优,所以转移过来的最近点是唯一的),然后由这个位置直接判断当前转移是否合法即可,( s [ i ] − s [ j − 1 ] > = s [ j − 1 ] − s [ L a [ j − 1 ] ] ( 1 ) s[i]-s[j-1]>=s[j-1]-s[La[j-1]]\ \ (1) s[i]s[j1]>=s[j1]s[La[j1]]  (1))
前一个的复杂度 O ( n 2 l o g ) O(n^2log) O(n2log),后一个 O ( n 2 ) O(n^2) O(n2)

我们继续观察式(1)
l [ i ] = s [ i ] − s [ L a [ i ] ] l[i]=s[i]-s[La[i]] l[i]=s[i]s[La[i]]
那么上式就可以变成 A ( i ) = s [ i ] > = s [ j − 1 ] + l [ j − 1 ] A(i)=s[i]>=s[j-1]+l[j-1] A(i)=s[i]>=s[j1]+l[j1]
也就是说我们需要找满足上述条件的最大的 j j j
那么我们为什么可以用单调队列呢?
显然, s [ i + 1 ] > = s [ i ] > = s [ j − 1 ] + l [ j − 1 ] s[i+1]>=s[i]>=s[j-1]+l[j-1] s[i+1]>=s[i]>=s[j1]+l[j1]
也就是说,随着i的增大,可选的j的集合是在上一个i的基础上不断变大的(性质1)
且如果 j 1 < j 2 & & A ( j 1 ) < = A ( j 2 ) j1<j2\&\&A(j1)<=A(j2) j1<j2&&A(j1)<=A(j2) j 1 j_1 j1一定优于 j 2 j_2 j2(性质2)
满足以上两个性质之后,我们就可以用单调队列去优化dp了
性质1其实保证了决策点的单调性,当前的决策点可以由上一个决策点的状态继承
而状态2其实就是满足了我们可以用当前优秀的决策点去替换之前更劣的决策点的性质。
这道题想过可能需要int128或者高精度
这里并没有用(不是因为我懒)


#include<bits/stdc++.h>
using namespace std;#define int long longconst int N = 4e7+10,P = (1<<30);
int n,op;
int f[N],q[N],l[N];
int he,ta;int Calc(int x){return x*1ll*x;}
int a[N],s[N];signed main(){cin>>n>>op;if (op == 0){for (int i = 1; i <= n; i++) cin>>a[i];}he = 1;q[++ta] = 0;for (int i = 1; i <= n; i++) s[i] = s[i-1]+a[i];f[0] = 0; l[0] =0 ;for (int i = 1; i <= n; i++){int now = s[i];while (he < ta && now >= l[q[he+1]]) ++he;//决策点单调性if (he <= ta) if (now >= l[q[he]]){f[i] = f[q[he]]+Calc(s[i]-s[q[he]]);l[i] = 2*s[i]-s[q[he]];while (l[i] < l[q[ta]] && he <= ta) ta--;//优替换劣q[++ta] = i;}}cout<<f[n];return 0;
}

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

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

相关文章

erlang学习: Mnesia Erlang数据库3

Mnesia数据库删除实现和事务处理 -module(test_mnesia). -include_lib("stdlib/include/qlc.hrl").-record(shop, {item, quantity, cost}). %% API -export([insert/3, select/0, select/1, delete/1, transaction/1,start/0, do_this_once/0]). start() ->mnes…

自然语言处理系列六十九》搜索引擎项目实战》搜索框架技术选型

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十九搜索引擎项目实战》搜索框架技术选型搜索…

(k8s)kubernetes 挂载 minio csi 的方式

一、安装Minio&#xff08;Minio分布式集群搭建部署_minio集群最少几台-CSDN博客&#xff09; 生成accessKeyID和secretAccessKey&#xff1a; 二、安装csi-s3插件(在k8s集群上) 首先我们把插件的yaml文件都下载下来&#xff0c;为了保证版本测试的一致性&#xff0c;我们下载…

828华为云征文|基于华为云Flexus云服务器X搭建jumpserver堡垒机软件

文章目录 ❀前言❀jumpserver堡垒机概述❀环境准备❀部署说明❀在线安装❀浏览器访问❀资产添加❀资产授权❀资产登录❀总结 ❀前言 近期华为云推出了最新的华为云Flexus云服务器X&#xff0c;这款云主机在算柔性算力做出了重大变革。华为云Flexus云服务器X基于擎天QingTian架…

QT设置闹钟超时播报

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimerEvent> #include<QTime> #include<QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic…

一个基于Spring Boot 3、Vue 3 和 Element-Plus 的中后台管理框架,流畅、直观且功能强大

前言 当前市面上的中后台管理系统虽然种类繁多&#xff0c;但在实际使用中仍存在不少痛点&#xff0c;比如技术栈陈旧、性能低下、扩展性差等问题。开发者们常常需要花费大量的时间和精力去处理这些问题&#xff0c;而不是专注于业务逻辑本身。 那么&#xff0c;有没有一个框…

计算赎金信

给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入&#xff…

使用3DUNet训练自己的数据集(pytorch)— 医疗影像分割

代码:lee-zq/3DUNet-Pytorch: 3DUNet implemented with pytorch (github.com) 文章<cicek16miccai.pdf (uni-freiburg.de)3D U-Net: Learning Dense Volumetric Segmentation

HarmonyOS学习(十)——网络编程

文章目录 1、通过HTTP请求网络2、Web组件2.1、加载本地网页2.2、加载在线网页2.3、网页缩放2.4、文本缩放2.5、web组件事件以及状态说明2.6、处理页面导航 1、通过HTTP请求网络 官方API文档地址&#xff1a;HTTP数据请求-Network Kit数据传输能力-Network Kit&#xff08;网络…

Linux 下 C/C++ 程序编译的过程

目录 一、GCC 工具链二、编译过程1、预处理2、编译3、汇编4、链接 本文将介绍如何将 C/C 语言编写的程序转换成为处理器能够执行的二进制代码的过程&#xff0c;包括四个步骤&#xff1a;预处理&#xff08;Preprocessing&#xff09;编译&#xff08;Compilation&#xff09;汇…

Qt_自定义信号

目录 1、自定义信号的规定 2、创建自定义信号 3、带参数的信号与槽 4、一个信号连接多个槽 5、信号与槽的断开 结语 前言&#xff1a; 虽然Qt已经内置了大量的信号&#xff0c;并且这些信号能够满足大部分的开发场景&#xff0c;但是Qt仍然允许开发者自定义信号&#…

ARMxy嵌入式边缘计算控制器支持Linux OS应用于AIOT

人工智能与物联网&#xff08;AIoT&#xff09;的融合正深刻改变着各个行业。而在这一变革中&#xff0c;ARMxy 嵌入式控制器以其卓越的性能和对 Linux OS 的支持&#xff0c;成为了 AIoT 应用的关键推动力量。 一、ARMxy 嵌入式控制器的优势 强大的处理能力 ARMxy 嵌入式控制…

浮毛危害人体健康?希喂、安德迈、有哈宠物空气净化器吸毛测评

养宠之前了解清楚相关的知识&#xff0c;这既是对宠物负责&#xff0c;也是对我们自己负责。宠物最让铲屎官头疼的就是毛发问题&#xff0c;大量脱落的毛发会带来繁重的清理任务&#xff0c;同时飘在空中浮毛还是潜藏在身边的健康”杀手“。浮毛微小、质量轻&#xff0c;容易随…

opencv之图像轮廓(三)--凸包

文章目录 前言获取凸包凸缺陷几何学测试测试轮廓是否是凸形的点到轮廓的距离 形状场景算法比较轮廓轮廓的特征值宽高比ExtentSolidity等效直径&#xff08;Equivalent Diameter&#xff09;方向掩模和像素点使用Numpy函数获取轮廓像素点使用OpenCV函数获取轮廓点 最大值和最小值…

VR 尺寸美学主观评价-解决方案-现场体验研讨会报名

棣拓科技VR创新解决方案助力尺寸美学所见即所得! 诚邀各位行业专家莅临指导交流 请扫描海报二维码踊跃报名&#xff0c;谢谢 中国上海 2024.10.25 亮点介绍 1、通过精湛渲染技术&#xff0c;最真实展现设计效果&#xff0c;并通过VR设备一比一比例进行展现。 2、设置相关设…

ctfshow-PHP反序列化

web254 源码 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2020-12-02 17:44:47 # Last Modified by: h1xa # Last Modified time: 2020-12-02 19:29:02 # email: h1xactfer.com # link: https://ctfer.com //mytime 2023-12-4 0:22 */ error_reporting(0)…

谈谈PCIe VID、DID、SSID、SSVID背后的智慧

PCIe Vendor ID 想了半天还是觉得从“ID是什么”这个问题开始比较好。那么ID是什么&#xff1f;ID就是身份。那身份又是什么&#xff1f;身份就是一个合理存在&#xff0c;用于区分不同个体。为什么叫“合理存在”呢&#xff1f;如果国家不给你发身份证&#xff0c;你就是黑户…

[笔记]电参数测量的现有方案

1.关键字&#xff1a; 电参数测量 Electrical Parameter Measurement 2.相关信息搜集 》》电参数测量仪是如何测量电压电流相位差的&#xff1f;对于变频器那种比较毛的波形&#xff0c;也能测量&#xff1f; 电参数测量仪测量电压电流相位差的方法主要依赖于其内部的高精度…

信号保存和处理

把上一篇回顾一下吧&#xff1a;共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;进程不再通过执行进入内核的系统调用来传递彼此的数据 共享内存的数据结构&#xff1a; struct shmid_ds {…

Pycharm使用debug运行时,一直显示collecting data...,但是变量一直显示不出来,显示超时

一、问题&#xff1a; 二、解决办法 1.File—>Setting 2.Build---->Python Debugger 3.勾选Gevent compatible &#xff0c;然后Apply 三、解释Gevent compatible 1.在 PyCharm 中&#xff0c;Gevent compatible 通常与 gevent 库的兼容性设置有关。gevent 是一个基于协…