P2120 仓库建设
P2120 仓库建设
题意
个工厂, 每个工厂有三个属性: 坐标 , 物品数 , 建设花费 , 可以选若干工厂建仓库, 第 个工厂的物品只能运往坐标大于等于它的位置仓库, 单个物品移动单位长度花费 .
求存储所有货物的最小花费
推导
设计 表示在 处设仓库 (不一定只在 设), 所有货物被存储的最小花费
设 , 前缀和 , , 写出方程
的意义是将 的所有物品移动到坐标 的花费, 所以我们就可以将移动费用理解成先把需要移动到 的物品移动到原点, 然后一起移动到 工厂
整理成函数
设
得到以 为自变量, 为因变量, 为斜率, 为截距的函数
其中, 斜率 单调, 自变量 单调, 因变量 单调, 直接用斜率优化
打出代码, 提交时是不开 O2
的最快代码 (, 最优解第一页唯一没开 O2
的), 开 O2
的最优解 ()
struct Factory {
long long x, p, c, sump, sumpx, K, f;
}F[1000005]; // 工厂属性
struct Hull {
long long x, y;
unsigned Ad;
}H[1000005], Then; // 凸壳
unsigned a[10005], now, n, l(1), r(1);
bool b[10005];
int main() {
n = RD();
for (register unsigned i(1); i <= n; ++i) {
F[i].x = RD();
F[i].p = RD();
F[i].c = RD();
F[i].sump = F[i - 1].sump + F[i].p;
F[i].sumpx = F[i - 1].sumpx + F[i].p * F[i].x;
F[i].K = F[i].sumpx - F[i].sump * F[i].x - F[i].c;
} // 各种预处理
for (register unsigned i(1); i <= n; ++i) {
while (l < r && ((H[l + 1].y - H[l].y) < (F[i].x) * (H[l + 1].x - H[l].x))) {
++l; // 弹出无用节点
}
now = H[l].Ad;
F[i].f = F[now].f + F[i].c + (F[i].sump - F[now].sump) * F[i].x - F[i].sumpx + F[now].sumpx; // 转移
Then.Ad = i;
Then.x = F[i].sump;
Then.y = F[i].f + F[i].sumpx;
while (l < r && ((Then.y - H[r].y) * (H[r].x - H[r - 1].x) < (H[r].y - H[r - 1].y) * (Then.x - H[r].x))) {
--r; // 删除上凸节点
}
H[++r] = Then;
}
printf("%lld\n", F[n].f);
return Wild_Donkey;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具