特别行动队题解

article/2025/8/26 23:47:36

特别行动队题解

刷水题什么的最愉快了。
题意十分明了,就是选出一种分配方案将士兵分为若干组,使修正后的战斗力最大。
我们先可以写出暴力dp转移:
\(f[n]\)为将前\(i\)个士兵分组,且第\(i\)个士兵为最后一组最后一个的最大战斗力。
\(f[i]=max_{j=1}^{j<i}f[j]+a*\sum_{k=j+1}^{k<=i}x[k] *\sum_{k=j+1}^{k<=i}x[k] +b*\sum_{k=j+1}^{k<=i}x[k] +c\)
时间复杂度:\(O(n^3)\)
设前缀和\(sum[i]=\sum_{j=1}^{j<=i}x[j]\)
则化为:\(f[i]=max_{j=1}^{j<i}f[j]+a*(sum[i]-sum[j])*(sum[i]-sum[j])+b*(sum[i]-sum[j])+c\)
最后斜率优化一下:
拆开平方,移项:
\(f[i]-a*sum[i]*sum[i]-b*sum[i]-c+2*sum[i]*sum[j]=f[j]+a*sum[j]*sum[j]-b*sum[j]\)
其中:
\(\bullet y=f[j]+a*sum[j]*sum[j]-b*sum[j]\)
\(\bullet k=2*sum[i]\)
\(\bullet x=sum[j]\)
\(\bullet b=f[i]-a*sum[i]*sum[i]-b*sum[i]-c\)
\(\therefore f[i]=y-kx+a*sum[i]*sum[i]+b*sum[i]+c\)
1655789-20190822154327907-790036712.png
代码:

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=1000006;
int n,head=1,tail=1;
ll f[N],sum[N],ans=0,a,b,c,t;
struct point{ll x,y;}tmp,q[N];
inline int read(){int T=0,F=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') F=-1; ch=getchar();}while(ch>='0'&&ch<='9') T=(T<<3)+(T<<1)+(ch-48),ch=getchar();return F*T; 
}
bool check(point u,point v,int z){return v.y-u.y>=2*a*sum[z]*(v.x-u.x);}
bool check2(point u,point v,point z){return (v.y-u.y)*(z.x-v.x)<=(z.y-v.y)*(v.x-u.x);}
int main(){n=read(),a=read(),b=read(),c=read();q[tail].x=0,q[tail].y=0;for(int i=1;i<=n;++i){t=read(),sum[i]=sum[i-1]+t;while(head<tail&&check(q[head],q[head+1],i)) ++head;f[i]=a*sum[i]*sum[i]+b*sum[i]+q[head].y-2*a*sum[i]*q[head].x+c,ans=max(ans,f[i]),tmp.x=sum[i],tmp.y=f[i]+a*sum[i]*sum[i]-b*sum[i];while(head<tail&&check2(q[tail-1],q[tail],tmp)) --tail;q[++tail]=tmp;} printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/ljk123-de-bo-ke/p/11394730.html


http://chatgpt.dhexx.cn/article/7isAXt6H.shtml

相关文章

特别行动队

Solution 设 f[x] 表示特别行动队前 x 名士兵编好队的最大战斗力。 f[x]=maxi−1k=0fk+a[A(i)−A(k)]x+b[A(i)−A(k)]+c 化简、移项&#xff1a;得到斜率方程&#xff1a; f[k]−f[j]a[A2(k)−A2(j)]−b[A(k)−A(j)]>2aA(i)⋅[A(k)−A(j)] 然后就可以斜率优化了。 Co…

浅谈斜率优化(例题特别行动队)

题目描述 你有一支由 n n n名预备役士兵组成的部队&#xff0c;士兵从 1 1 1到 n n n编号&#xff0c;要将他们拆分 成若干特别行动队调入战场。出于默契的考虑&#xff0c;同一支特别行动队中队员的编号应该连续&#xff0c;即为形如 ( i , i 1 , . . . , i k ) ( i , i 1 …

numpy.meshgrid 用法说明

numpy.meshgrid(*xi, copyTrue, sparseFalse, indexingxy) return: X1, X2,..., XN 其中 *xi x1, x2,..., xn 都表示一维 array。 我们从下面这个简单的例子来看 meshgrid 做了什么&#xff1a; import numpy as npa np.array([2, 4, 8]) b np.array([3, 6])x, y np.mes…

MATLAB:Meshgrid用法

MATLAB-基础画图meshgrid - 知乎 (zhihu.com) 在MATLAB绘制三维曲面图或三维网格图时经常会用到meshgrid指令 比如&#xff1a;通常在确定向量x,y的基础上&#xff0c;使用meshgrid生成新的矩阵数据[X,Y],再输入函数Zf(X,Y),最后使用mesh或surf命令生成三维网格图或三维曲面图…

Python语言Numpy包之Meshgrid 函数

1 Meshgrid 函数的基本用法 在 Numpy 的官方文章里&#xff0c; meshgrid 函数的英文描述也显得文绉绉的&#xff0c;理解起来有些难度。可以这么理解&#xff0c; meshgrid 函数用两个坐标轴上的点在平面上画网格。 用法&#xff1a; [X,Y]meshgrid(x,y) [X,Y]meshgrid(…

matlab meshgrid函数

作用&#xff1a; 创建二维、三维矩阵 格式&#xff1a; [X,Y] meshgrid(x,y) [X,Y] meshgrid(x) [X,Y,Z] meshgrid(x,y,z) [X,Y,Z] meshgrid(x) eg: >> [x,y]meshgrid(1:1:3,5:1:6)x 1 2 31 2 3 y 5 5 56 6 6 …

【Numpy】 meshgrid()函数

np.mesharid()函数通常用来生成二维数据网格&#xff0c;例如一张灰度图片中长为x轴&#xff0c;宽为y轴&#xff0c;图中每一个像素点。 可以接受两个一维数组生成两个二维矩阵&#xff1a; np.meshgrid(np.arange(4),np.arange(4))我们生成的结果为&#xff1a; [array([[…

NumPy(十七):Meshgrid函数【应用场景:等高线、SVC中超平面的绘制】

一、Meshgrid函数 import numpy as np import matplotlib.pyplot as pltx np.linspace(0, 1, 5) y np.linspace(0, 1, 3) print("x ", x) print("-" * 50) print("y ", y) print("-" * 100)X, Y np.meshgrid(x, y) print("…

opencv-meshgrid

opencv-meshgrid 一句话描述 使用opencv::repeat函数和std::iota函数完成meshgrid功能。 小例程 cv::Mat Z cv::Mat::zeros(3, 5, CV_8UC1), X, Y;int x_length Z.cols, y_length Z.rows;std::vector<int> x(x_length);std::iota(x.begin(), x.end(), 1);X cv::re…

python扩展库numpy中函数meshgrid()的使用[当你想要两个for循环嵌套处理时,就该想到它]

看一个简单的例子&#xff1a; 设有一个3阶方阵Z&#xff0c; 其值由式子x^2 y^2生成。 x的取值为4&#xff0c;5&#xff0c;6&#xff1b; y的取值为7&#xff0c;8&#xff0c;9。 按常规的思路应该是由两个循环生成方阵Z&#xff0c;即如下的代码&#xff1a; #!/usr/bin…

np.meshgrid()

目录 1.meshgrid函数介绍2.meshgrid函数官方说明 1.meshgrid函数介绍 参数&#xff1a; *xi&#xff0c;也就是x1&#xff0c;x2&#xff0c;…&#xff0c;xn &#xff1a;表示网格坐标的一维数组。 copy&#xff1a;默认为True&#xff0c;如果为False&#xff0c;就返回原始…

【matlab】meshgrid的使用

函数参数列表 [X,Y] meshgrid(x,y) [X,Y] meshgrid(x) [X,Y,Z] meshgrid(x,y,z) [X,Y,Z] meshgrid(x) meshgrid可以生成2D或者3D的矩阵&#xff0c; 如果为2D&#xff0c;矩阵的shape为&#xff08;y.length, x.length&#xff09; 如果为3D&#xff0c;矩阵的shape为&a…

np.meshgrid

np.meshgrid参考 官方文档给出的解释 Return coordinate matrices from coordinate vectors. Make N-D coordinate arrays for vectorized evaluations of N-D scalar/vector fields over N-D grids, given one-dimensional coordinate arrays x1, x2,…, xn. 参数 indexing : …

meshgrid方法

目录 meshgrid 绘制曲面图三维网络 meshgrid meshgrid 和 mesh 方法的差别在于是否会画出栅格线 绘制曲面图 生成绘制3D图形所需的网格数据。因为在计算机中进行绘图操作时&#xff0c;往往需要一些采样点&#xff0c;然后根据这些采样点来绘制出整个图形。 涉及到x、y这两组数…

matlab meshgrid作用,【 MATLAB 】ndgrid 和 meshgrid 对比理解以及应用

目录 背景 本博文主要分析 ndgrid&#xff0c; meshgrid是附送的&#xff0c;都是类似的东西&#xff0c;学会了一个&#xff0c;另一个很容易就理解了。 为什么会对 ndgrid 感兴趣呢&#xff1f;因为对它的不理解&#xff0c;导致我少写了几篇博文&#xff0c;最后&#xff0c…

Meshgrid用法

在matlab绘制三维曲面图或三维网格图时经常会用到meshgrid指令 比如&#xff1a;通常在确定向量x,y的基础上&#xff0c;使用meshgrid生成新的矩阵数据[X,Y],再输入函数Zf(X,Y),最后使用mesh或surf命令生成三维网格图或三维曲面图。 那么meshgrid指令究竟是什么意思呢&#x…

【matlab】函数meshgrid的用法详解(生成网格矩阵)和ndgrid的区别及用法

------------------------------------------------------------------ meshgrid 函数用来生成网格矩阵&#xff0c;可以是二维网格矩阵。 exp1_1:生成二维网格&#xff0c;用法为&#xff1a;[x y]meshgrid(a b); % a 和b是一维数组&#xff0c;如a[1 2 3]; b [2 3 4]; 则生成…

Python基础(二):Numpy函数介绍:Meshgrid,mgrid,append等

文章目录 np.meshgrid函数np.mgrid函数np.append()函数 [5]参考资料 np.meshgrid函数 meshgrid函数通常使用在数据的矢量化上。它适用于生成网格型数据&#xff0c;可以接受两个一维数组生成两个二维矩阵&#xff0c;对应两个数组中所有的(x,y)对。 meshgrid的作用是&#xf…

【Python】Numpy 中 Meshgrid 函数介绍及简单应用

简单介绍Meshgrid 文字解释 Meshgrid功能为将两个坐标轴上的点转化为平面上的网格&#xff0c;即将两组一维数据分别转化为二维数据&#xff0c;原理为简单复制&#xff08;通过简单复制将以为数组转化为二维数组&#xff0c;即格点&#xff09;。 以上的详细解释&#xff1a…

图像处理之matlab中meshgrid函数用法详解

一、meshgrid()函数基本调用格式 meshgrid函数用来生成网格矩阵&#xff0c;既可以是二维网格矩阵&#xff0c;又可以是三维网格矩阵。 1、[X,Y] meshgrid(x,y) :基于向量x和y中包含的坐标返回二维网格坐标。X是一个矩阵&#xff0c;每一行是x的一个副本&#xff0c;Y也是一…