博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【洛谷 P2120】 [ZJOI2007]仓库建设(斜率优化)
阅读量:5108 次
发布时间:2019-06-13

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

斜率优化+1,好吧不水分了。
玩具装箱那题以后再做,当作复习吧。
\(f[i]=f[j]-(sum[i]-sum[j])*dis[i]+p[i]\)
\(f[j]=-dis[i]*sum[j]+sum[i]*dis[i]+f[i]-p[i]\)

#include 
#include
using namespace std;#define ll long longconst int MAXN = 1000010;inline int read(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); } return s * w;}int p[MAXN], sum[MAXN], dis[MAXN], q[MAXN], c[MAXN];int n, head, tail;ll ans = 2147483647;ll f[MAXN];inline double k(int i, int j){ return (double)(f[i] - f[j]) / (sum[i] - sum[j]);}int main(){ n = read(); for(int i = 1; i <= n; ++i){ dis[i] = read(); sum[i] = sum[i - 1] + (c[i] = read()); p[i] = read(); } f[0] = p[n]; for(int i = 1; i <= n; ++i){ dis[i] = dis[n] - dis[i]; f[0] += (ll)dis[i] * c[i]; } ans = f[0]; for(int i = 1; i < n; ++i){ while(head < tail && k(q[head], q[head + 1]) < -dis[i]) ++head; int j = q[head]; f[i] = f[j] - (ll)(sum[i] - sum[j]) * dis[i] + p[i]; ans = min(ans, f[i]); while(head < tail && k(q[tail - 1], q[tail]) >= k(q[tail], i)) --tail; q[++tail] = i; } printf("%lld\n", ans); return 0;}

转载于:https://www.cnblogs.com/Qihoo360/p/10329587.html

你可能感兴趣的文章
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
基于docker的spark-hadoop分布式集群之一: 环境搭建
查看>>
oracle 几个时间函数探究
查看>>
第一个Java Web程序
查看>>
Atomic
查看>>
div 显示滚动条与div显示隐藏的CSS代码
查看>>
Redis-1-安装
查看>>
Access denied for user ''@'localhost' to database 'mysql'
查看>>
微信公众号里面使用地图导航
查看>>
部署支持 https 的 Nginx 服务
查看>>
‘Cordova/CDVPlugin.h’ file not found
查看>>
WebAssembly是什么?
查看>>
C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件)...
查看>>
树状数组_一维
查看>>
【拓扑排序】【最短路】【最小生成树】Day 9.2
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
C# 使用 Abot 实现 爬虫 抓取网页信息 源码下载
查看>>
嵌入式软件设计第8次实验报告
查看>>
NP难问题求解综述
查看>>