洛谷 P3628/SPOJ 15648 APIO2010 特别行动队 Commando

题意

你有一支由 n n n 名预备役士兵组成的部队,士兵从 1 1 1 n n n 编号,你要将他们拆分成若干特别行动队调入战场。出于默契的考虑,同一支特别行动队中队员的编号应该连续,即为形如 i , i + 1 , ⋯ , i + k i, i + 1, \cdots ,i + k i,i+1,,i+k的序列。所有的队员都应该属于且仅属于一支特别行动队。

编号为 i i i 的士兵的初始战斗力为 x i x_i xi ,一支特别行动队的初始战斗力 X X X 为队内士兵初始战斗力之和,即 X = x i + x i + 1 + ⋯ + x i + k X = x_i + x_{i+1} + \cdots + x_{i+k} X=xi+xi+1++xi+k

通过长期的观察,你总结出对于一支初始战斗力为 X X X 的特别行动队,其修正战斗力 X ′ = a X 2 + b X + c X'= aX^2+bX+c X=aX2+bX+c,其中 a , b , c a,~b,~c a, b, c 是已知的系数。 作为部队统帅,现在你要为这支部队进行编队,使得所有特别行动队的修正战斗力之和最大。试求出这个最大和。

1 ≤ n ≤ 1 0 6 1 \leq n \leq 10^6 1n106 − 5 ≤ a ≤ − 1 -5 \leq a \leq -1 5a1 − 1 0 7 ≤ b , c ≤ 1 0 7 -10^7 \leq b,c \leq 10^7 107b,c107 1 ≤ x i ≤ 100 1 \leq x_i \leq 100 1xi100

思路

先考虑朴素的 dp,令 f i f_i fi 表示将前 i i i 个人分队完毕的最大战斗力,设:
s i = ∑ j = 1 i x i , z ( x ) = a x 2 + b x + c s_i=\sum_{j=1}^{i}x_i,\ z(x)=ax^2+bx+c si=j=1ixi, z(x)=ax2+bx+c

那么有:
f i = max ⁡ j ∈ [ 1 , i ) { f j + z ( s i − s j ) } f_i=\max_{j\in[1,i)}\left \{f_j+z(s_i-s_j)\right \} fi=j[1,i)max{fj+z(sisj)}

去到了 Θ ( n 2 ) \Theta(n^2) Θ(n2) 级别。由上一篇题解的经验,考虑使用斜率优化掉找 j j j Θ ( n ) \Theta(n) Θ(n)

设有决策点 j 1 j1 j1 j 2 j2 j2 j 2 j2 j2 优于 j 1 j1 j1,那么:
f j 1 + z ( s i − s j 1 ) ≤ f j 2 + z ( s i − s j 2 ) f_{j1}+z(s_i-s_{j1})\le f_{j2}+z(s_i-s_{j2}) fj1+z(sisj1)fj2+z(sisj2)

f j 1 + a ( s i − s j 1 ) 2 + b ( s i − s j 1 ) ≤ f j 2 + a ( s i − s j 2 ) 2 + b ( s i − s j 2 ) f_{j1}+a(s_i-s_{j1})^2+b(s_i-s_{j1})\le f_{j2}+a(s_i-s_{j2})^2+b(s_i-s{j2}) fj1+a(sisj1)2+b(sisj1)fj2+a(sisj2)2+b(sisj2)

f j 1 + a s i 2 + a s j 1 2 − 2 a s i s j 1 + b s i − b s j 1 ≤ f j 2 + a s i 2 + a s j 2 2 − 2 a s i s j 2 + b s i − b s j 2 f_{j1}+as_i^2+as_{j1}^2-2as_is_{j1}+bs_i-bs_{j1}\le f_{j2}+as_i^2+as_{j2}^2-2as_is_{j2}+bs_i-bs_{j2} fj1+asi2+asj122asisj1+bsibsj1fj2+asi2+asj222asisj2+bsibsj2

f j 1 − f j 2 − b s j 1 + b s j 2 + a s j 1 2 − a s j 2 2 ≤ 2 a s i s j 1 − 2 a s i s j 2 f_{j1}-f_{j2}-bs_{j1}+bs_{j2}+as_{j1}^2-as_{j2}^2\le 2as_is_{j1}-2as_is_{j2} fj1fj2bsj1+bsj2+asj12asj222asisj12asisj2

f j 1 − f j 2 − b ( s j 1 − s j 2 ) + a ( s j 1 2 − s j 2 2 ) ≤ 2 a s i ( s j 1 − s j 2 ) f_{j1}-f_{j2}-b(s_{j1}-s_{j2})+a(s_{j1}^2-s_{j2}^2)\le 2as_i(s_{j1}-s_{j2}) fj1fj2b(sj1sj2)+a(sj12sj22)2asi(sj1sj2)

因为 s j 1 < s j 2 s_{j1}<s_{j2} sj1<sj2,因而注意变号:
f j 1 − f j 2 − b ( s j 1 − s j 2 ) + a ( s j 1 2 − s j 2 2 ) 2 a ( s j 1 − s j 2 ) ≥ s i \frac{f_{j1}-f_{j2}-b(s_{j1}-s_{j2})+a(s_{j1}^2-s_{j2}^2)}{2a(s_{j1}-s_{j2})}\ge s_i 2a(sj1sj2)fj1fj2b(sj1sj2)+a(sj12sj22)si

那就不妨拿个 g i = a s i 2 + b s i g_i=as_i^2+bs_i gi=asi2+bsi 来代换了:
f j 1 − f j 2 + g j 1 − g j 2 2 a ( s j 1 − s j 2 ) ≥ s i \frac{f_{j1}-f_{j2}+g_{j1}-g_{j2}}{2a(s_{j1}-s_{j2})}\ge s_i 2a(sj1sj2)fj1fj2+gj1gj2si

斜率 s l o p e ≥ s i slope\ge s_i slopesi s i s_i si 单增,由下图,扔到符合条件区间的尾巴去。

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define dd double
const ll N=1e6+9,inf=0x3f3f3f3f;
ll n,a,b,c,x[N];
ll s[N],g[N],f[N],q[N];
ll _2(ll x)
{return x*x;
}
ll z(ll x)
{return a*_2(x)+b*x+c;
}
dd slope(ll j1,ll j2)
{return (dd)(f[j1]-f[j2]+g[j1]-g[j2])/(dd)(2*a*(s[j1]-s[j2]));
}
int main()
{scanf("%lld%lld%lld%lld",&n,&a,&b,&c);for(int i=1;i<=n;i++){scanf("%lld",&x[i]);s[i]=s[i-1]+x[i];g[i]=a*_2(s[i])-b*s[i];}memset(f,-inf,sizeof(f));ll hh=0,tt=0;f[0]=0;for(int i=1;i<=n;i++){while(hh<tt&&slope(q[hh],q[hh+1])<=s[i])hh++;//slope>s[i]单增,扔队尾 f[i]=f[q[hh]]+z(s[i]-s[q[hh]]);while(hh<tt&&slope(q[tt],i)<slope(q[tt-1],q[tt]))tt--;q[++tt]=i;}printf("%lld",f[n]);return 0;
}

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

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

相关文章

PCL源码分析:曲面法向量采样

文章目录 一、简介二、源码分析三、实现效果参考资料一、简介 曲面法向量点云采样,整个过程如下所述: 1、空间划分:使用递归方法将点云划分为更小的区域, 每次划分选择一个维度(X、Y 或 Z),将点云分为两部分,直到划分区域内的点少于我们指定的数量,开始进行区域随机采…

Go语言--语法基础2--下载安装

2、下载安装 1、下载源码包&#xff1a; go1.18.4.linux-amd64.tar.gz。 官方地址&#xff1a;https://golang.google.cn/dl/ 云盘地址&#xff1a;链接&#xff1a; https://pan.baidu.com/s/1N2jrRHaPibvmmNFep3VYag 提 取码&#xff1a; zkc3 2、将下载的源码包解压…

lowagie(itext)老版本手绘PDF,包含页码、水印、图片、复选框、复杂行列合并等。

入口类&#xff1a;exportPdf ​ package xcsy.qms.webapi.service;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.StringUtils; import com.ibm.icu.text.RuleBasedNumberFormat; import com.lowa…

3-2 WPS JS宏 工作簿的打开与保存(模板批量另存为工作)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…

Ubuntu20.04之VNC的安装使用与常见问题

Ubuntu20.04之VNC的安装与使用 安装图形桌面选择安装gnome桌面选择安装xface桌面 VNC-Server安装配置开机自启 VNC Clientroot用户无法登入问题临时方案永久方案 安装图形桌面 Ubuntu20.04主流的图形桌面有gnome和xface两种&#xff0c;两种桌面的安装方式我都会写&#xff0c…

Day46 反转字符串

I. 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 class Solution {public void reverseString(char[] s) {int i …

用FileZilla Server 1.9.4给Windows Server 2025搭建FTP服务端

FileZilla Server 是一款免费的开源 FTP 和 FTPS 服务器软件&#xff0c;分为服务器版和客户端版。服务器版原本只支持Windows操作系统&#xff0c;比如笔者曾长期使用过0.9.60版&#xff0c;那时候就只支持Windows操作系统。当时我们生产环境对FTP稳定性要求较高&#xff0c;比…

【愚公系列】《Python网络爬虫从入门到精通》033-DataFrame的数据排序

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

营销过程乌龟图模版

营销过程乌龟图模版 输入 公司现状产品服务客户问询客户期望电话、电脑系统品牌软件硬件材料 售前 - 沟通 - 确定需求 - 满足需求 - 售后 机料环 电话、电脑等设备软件硬件、系统品牌等工具材料 人 责任人协助者生产者客户 法 订单由谁评审控制程序营销过程控制程序顾客满意度…

Kubernetes (K8S) 高效使用技巧与实践指南

Kubernetes&#xff08;K8S&#xff09;作为容器编排领域的核心工具&#xff0c;其灵活性和复杂性并存。本文结合实战经验&#xff0c;从运维效率提升、生产环境避坑、核心功能应用等维度&#xff0c;总结高频使用技巧与最佳实践&#xff0c;分享如何快速掌握 K8S。 一、kubect…

Idea java项目结构介绍

一般来说&#xff0c;一个典型的 IntelliJ IDEA Java 项目具有特定的结构&#xff0c;以下是对其主要部分的介绍&#xff1a; 项目根目录 项目的最顶层目录&#xff0c;包含了整个项目的所有文件和文件夹&#xff0c;通常以项目名称命名。在这个目录下可以找到.idea文件夹、.g…

C++大整数类的设计与实现

1. 简介 我们知道现代的计算机大多数都是64位的&#xff0c;因此能处理最大整数为 2 64 − 1 2^{64}-1 264−1。那如果是超过了这个数怎么办呢&#xff0c;那就需要我们自己手动模拟数的加减乘除了。 2. 思路 我们可以用一个数组来存储大数&#xff0c;数组中的每一个位置表…

2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析

文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需要从中挑出一些…

开源RAG主流框架有哪些?如何选型?

开源RAG主流框架有哪些?如何选型? 一、开源RAG框架全景图 (一)核心框架类型对比 类型典型工具技术特征适用场景传统RAGLangChain, Haystack线性流程(检索→生成)通用问答、知识库检索增强型RAGRAGFlow, AutoRAG支持重排序、多路召回优化高精度问答、复杂文档处理轻量级…

Java SE与Java EE

Java SE&#xff08;Java 平台标准版&#xff09; Java SE 是 Java 平台的核心&#xff0c;提供了 Java 语言的基础功能。它包含了 Java 开发工具包&#xff08;JDK&#xff09;&#xff0c;其中有 Java 编译器&#xff08;javac&#xff09;、Java 虚拟机&#xff08;JVM&…

【Java企业生态系统的演进】从单体J2EE到云原生微服务

Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务 目录标题 Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务摘要1. 引言2. 整体框架演进&#xff1a;从原始Java到Spring Cloud2.1 原始Java阶段&#xff08;1995-1999&#xff09;2.2 J2EE阶段&#x…

kicad中R树的使用

在 KiCad 中&#xff0c;使用 R树&#xff08;R-tree&#xff09;进行空间索引和加速查询通常不在用户层面直接操作&#xff0c;而是作为工具的一部分用于优化电路板设计的性能&#xff0c;尤其在布局、碰撞检测、设计规则检查&#xff08;DRC&#xff09;以及元件搜索等方面。…

org.springframework.boot不存在的其中一个解决办法

最近做项目的时候发现问题&#xff0c;改了几次pom.xml文件之后突然发现项目中的注解全部爆红。 可以尝试点击左上角的循环小图标&#xff0c;同步所有maven项目。 建议顺便检查一下Project Structure中的SDK和Language Level是否对应&#xff0c;否则可能报类似&#xff1a;“…

C语言实现通讯录项目

一、通讯录功能 实现一个可以存放100个人的信息的通讯录&#xff08;这里采用静态版本&#xff09;&#xff0c;每个人的信息有姓名、性别、年龄、电话、地址等。 通讯录可以执行的操作有添加联系人信息、删除指定联系人、查找指定联系人信息、修改指定联系人信息、显示联系人信…

HO3D_v3(handposeX-json 格式)数据集-release >> DataBall

注意&#xff1a; 1)为了方便使用&#xff0c;按照 handposeX json 自定义格式存储 2)使用常见依赖库进行调用,降低数据集使用难度。 3)部分数据集获取请加入&#xff1a;DataBall-X数据球(free) 4)完整数据集获取请加入&#xff1a;DataBall-X数据球(vip) HO3D 数据集官方…