P4544 [USACO10NOV] Buying Feed G

思路:

考虑动态规划算法。

定义 dpi,j 表示达到第 i 家商店时共买了 j 吨饲料的最小花费,那么我们可以枚举到达上一家店的饲料数 k

dpi,j=(xixi1)×j2+mink=jfi1jdpi1,k+ci1×(jk)

可以将和 i1i 有关的提到一边,这样可以方便转移:

dpi,j=(xixi1)×j2+ci1×j+mink=jfi1jdpi1,kk×ci1

注意到对于区间 [jfi1,j],当 j 增加时,右端点增加 1,左端点也增加 1,那么我们可以使用单调队列维护这个范围的最小值。

时间复杂度为 O(MK)

完整代码:

#include<bits/stdc++.h>
#define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y)
#define lowbit(x) x&(-x)
#define pi pair<ll,ll>
#define pii pair<ll,pair<ll,ll>>
#define iip pair<pair<ll,ll>,ll>
#define ppii pair<pair<ll,ll>,pair<ll,ll>>
#define fi first
#define se second
#define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x
#define Full(a) memset(a,0,sizeof(a))
#define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout);
using namespace std;
typedef double db;
typedef unsigned long long ull;
typedef long long ll;
bool Begin;
const ll N=505,M=10010,INF=1e18;
inline ll read(){
ll x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
inline void write(ll x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
struct Node{
ll x,y,z;
bool operator<(const Node&rhs)const{
if(x!=rhs.x)
return x<rhs.x;
return z<rhs.z;
}
}G[N];
ll n,x,m,l,r,head=0,tail=1;
ll a[N],b[N],c[N],Q[M];
ll dp[N][M];
bool End;
int main(){
// open("A.in","A.out");
memset(dp,0x3f,sizeof(dp));
m=read(),x=read(),n=read();
for(int x,y,z,i=1;i<=n;i++){
x=read(),y=read(),z=read();
G[i]={x,y,z};
}
sort(G+1,G+n+1);
for(int i=1;i<=n;i++){
a[i]=G[i].x;
b[i]=G[i].y;
c[i]=G[i].z;
}
a[n+1]=x;
dp[1][0]=0;
for(int i=2;i<=n+1;i++){
head=1,tail=0;
for(int j=0;j<=m;j++){
while(dp[i-1][j]-j*c[i-1]<=dp[i-1][Q[tail]]-Q[tail]*c[i-1]&&head<=tail)
tail--;
while(Q[head]<j-b[i-1]&&head<=tail)
head++;
Q[++tail]=j;
dp[i][j]=dp[i-1][Q[head]]+(a[i]-a[i-1])*j*j+c[i-1]*(j-Q[head]);
}
}
write(dp[n+1][m]);
cerr<<'\n'<<abs(&Begin-&End)/1048576<<"MB";
return 0;
}
posted @   rgw2010  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示