[bzoj3437]小P的牧场
题面在这里
题意
有n个牧场,自西向东呈一字形排列,需要控制这些牧场,
每个牧场上可以花费ai的费用建立一个控制站,
每个控制站控制的牧场是它所在的牧场一直到它西边第一个控制站之前的所有牧场,每个牧场i的放养量是bi,求最小总费用
数据范围
1≤n≤105,0<ai,bi≤104
sol
不出意外的话应该是斜率DP最后一道入门题了
设f[i]表示在第i个牧场建立一个控制站并控制之前所有牧场的最小费用,有
f[i]=mini−1j=0(f[j]+i∑k=j+1b[k](i−k)+a[i])
令c[i]=∑ij=1(b[j]×j),d[i]=∑ij=1b[j],有
=mini−1j=0(f[j]−i∑k=j+1(b[k]×k)+i×i∑k=j+1b[k]+a[i])
=mini−1j=0(f[j]−(c[i]−c[j])+i×(d[i]−d[j])+a[i])
=mini−1j=0(f[j]+c[j]−i×d[j])+a[i]+i×d[i]−c[i]
斜率优化,插点(d[j],f[j]+c[j]),询问递增斜率ki=i
代码
#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mp make_pair
#define pub push_back
#define puf push_front
#define pob pop_back
#define pof pop_front
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-10;
const int mod=1e8;
const int N=1000010;
il ll read(){
RG ll data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
}
il void file(){
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
ll n,a[N],b[N],c[N],d[N],f[N];
struct node{ll x,y;}Q[N];ll L=1,R;
il void insert(node q){
while(L<R&&(Q[R].y-Q[R-1].y)*(q.x-Q[R].x)>=(q.y-Q[R].y)*(Q[R].x-Q[R-1].x))R--;
Q[++R]=q;
}
il ll query(ll k){
while(L<R&&k*(Q[L+1].x-Q[L].x)>=Q[L+1].y-Q[L].y)L++;
return Q[L].y-k*Q[L].x;
}
int main()
{
n=read();
for(RG int i=1;i<=n;i++)a[i]=read();
for(RG int i=1;i<=n;i++){
b[i]=read();c[i]=c[i-1]+b[i]*i;d[i]=d[i-1]+b[i];
}
insert((node){0,0});
for(RG int i=1;i<=n;i++){
f[i]=query(i)+a[i]+i*d[i]-c[i];
insert((node){d[i],f[i]+c[i]});
}
printf("%lld\n",f[n]);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 我干了两个月的大项目,开源了!
· 推荐一款非常好用的在线 SSH 管理工具
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 千万级的大表,如何做性能调优?
· .NET周刊【1月第1期 2025-01-05】