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

ops/2025/2/27 7:39:14/

题意

你有一支由 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.ppmy.cn/ops/161616.html

相关文章

深度学习中卷积层(Conv)、BN层(Batch Normalization)和 ReLU层(Rectified Linear Unit)的详细介绍

一、卷积层&#xff08;Conv&#xff09; 定义 卷积层是深度学习中卷积神经网络&#xff08;CNN&#xff09;的核心组成部分。它通过对输入数据&#xff08;如图像&#xff09;进行卷积操作来提取特征。卷积操作是用一个卷积核&#xff08;也称为滤波器&#xff09;在输入数据上…

华为数通Datacom认证体系详解:从HCIA到HCIE的进阶路径

华为数通Datacom&#xff08;Data Communication&#xff09;课程是华为认证体系中的核心方向之一&#xff0c;聚焦企业网络通信与数据通信技术&#xff0c;适合从事网络规划、部署和运维的人员。 一、数通Datacom课程体系 华为数通Datacom认证分为 三个级别&#xff0c;逐级递…

ARP协议的工作原理

ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;的工作原理是通过请求-响应的方式&#xff0c;将目标设备的IP地址解析为对应的MAC地址。以下是ARP协议的工作原理的详细步骤&#xff1a; 1. ARP请求&#xff08;ARP Request&#xff09; 当设…

【MySQL】索引(上)

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;【MySQL】索引(上) 发布时间&#xff1a;2025.2.26 隶属专栏&#xff1a;MySQL 目录 初始索引基本介绍常见索引分类案例使用 认识磁盘MySQL 与 存储关于磁盘关于扇区定位扇区结论磁盘随机访问(Random Access)与连续…

dataSource already closed

之前的代码是单线程跑&#xff0c;由定时任务触发&#xff0c;考虑到以后数据量可能变大&#xff0c;就改用多线程处理&#xff0c;改完之后进行单元测试报错&#xff1a; org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nes…

LLC谐振变换器恒压恒流双竞争闭环simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09;针对全桥LLC拓扑&#xff0c;利用Matlab软件搭建模型&#xff0c;分别对轻载&#xf…

android keystore源码分析

架构 Android Keystore API 和底层 Keymaster HAL 提供了一套基本的但足以满足需求的加密基元&#xff0c;以便使用访问受控且由硬件支持的密钥实现相关协议。 Keymaster HAL 是由原始设备制造商 (OEM) 提供的动态加载库&#xff0c;密钥库服务使用它来提供由硬件支持的加密服…

string类详解(下)

文章目录 4. string类的模拟实现4.1 构造 析构4.2 c_str4.3 下标遍历4.4 迭代器4.5 插入4.6 删除4.7 查找4.8 赋值4.9 交换4.10 提取子串4.11 比较大小4.12 流插入 && 流提取 5. 现代版写法的String类5.1 完整代码 6. 写时拷贝&#xff08;了解&#xff09; 4. string…