博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1096 [ZJOI2007]仓库建设
阅读量:5174 次
发布时间:2019-06-13

本文共 1560 字,大约阅读时间需要 5 分钟。

蒟蒻就写一下简单题吧。。。

此题很容易写出dp的方程:

令f[i]表示i号点要建仓库的话最小总费用,则

f[i] = min(f[j]  + (x[i] - x[j + 1]) * p[i + 1] + (x[i] - x[j + 2])* p[i + 2] + ... + (x[i] - x[i]) * p[i]) + c[i]

然后把min里面的东西展开再合并,并且令

sp[i] = p[1] + p[2] + ... + p[i]

s[i] = x[1] * p[1] + x[2] * p[2] + ... + x[i] * p[i]

那么:

f[i] = min(f[j] + s[j] - x[i] * sp[j]) + c[i] + sp[i] * x[i] - s[i];

然后前面的min里的式子可以斜率优化掉,就做完了。(我好像会自己推了?进步+1^_^)

 

 

1 #include 
2 #include
3 #include
4 5 using namespace std; 6 7 long long q[1200000], s[1200000], sp[1200000], f[1200000], g[1200000]; 8 long long x; 9 int l = 1, r = 1, n;10 11 inline bool pop_head(){12 int a = q[l], b = q[l + 1];13 return (long long) g[b] - g[a] < (long long)x * (sp[b] - sp[a]);14 }15 16 inline bool pop_tail(int i){17 int a = q[r - 1], b = q[r];18 return (long long) (g[b] - g[a]) * (sp[i] - sp[b]) >= (long long) (g[i] - g[b]) * (sp[b] - sp[a]);19 }20 21 int main(){22 scanf("%d\n", &n);23 long long p, c;24 q[1] = 0;25 int j;26 for (int i = 1; i <= n; ++i){27 scanf("%lld %lld %lld\n", &x, &p, &c);28 sp[i] = sp[i - 1] + p;29 s[i] = s[i - 1] + x * p;30 while (l < r && pop_head()) ++l;31 j = q[l];32 f[i] = g[j] - x * sp[j] + c + sp[i] * x - s[i];33 g[i] = f[i] + s[i];34 while (l < r && pop_tail(i)) --r;35 q[++r] = i;36 }37 printf("%lld\n", f[n]);38 return 0;39 }
View Code

(p.s. 沙茶的我把q写成g,结果WA了两次。。。)

转载于:https://www.cnblogs.com/rausen/p/4019227.html

你可能感兴趣的文章
软件工程--第十六周学习进度
查看>>
yii2 ActiveRecord多表关联以及多表关联搜索的实现
查看>>
搜狗输入法安装--ubuntu
查看>>
ps/2接口键盘的输入及显示
查看>>
Swift———a Glance(极客学院)笔记
查看>>
【poj3294-不小于k个字符串中最长公共子串】后缀数组
查看>>
java如何获取其它用户登录的真是IP地址
查看>>
Jquery通过指定层次关系获取元素
查看>>
c# for 和 foreach 的区别
查看>>
docfx (一)
查看>>
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
查看>>
深度学习之前馈神经网络(前向传播和误差反向传播)
查看>>
IEnumerable<T>和IQueryable<T>区别
查看>>
(转)MFC界面风格
查看>>
Centos7 tmux1.6 安装
查看>>
二叉树(三)
查看>>
linux加密文件系统 fsck 无法修复一例
查看>>
【linux配置】VMware安装Redhat6.5
查看>>
AI自主决策——有限状态机
查看>>
《http权威指南》阅读笔记(二)
查看>>