P2120 仓库建设

P2120 仓库建设

又是斜优, 这里是直通车

题意

n 个工厂, 每个工厂有三个属性: 坐标 x, 物品数 p, 建设花费 c, 可以选若干工厂建仓库, 第 i 个工厂的物品只能运往坐标大于等于它的位置仓库, 单个物品移动单位长度花费 1.

求存储所有货物的最小花费

1n106,0x,p,c231,ans+pixi<263

推导

设计 fi 表示在 i 处设仓库 (不一定只在 i 设), [1,i] 所有货物被存储的最小花费

pi, pixi 前缀和 sumpi, sumpxi, 写出方程

sumpxi 的意义是将 [1,i] 的所有物品移动到坐标 0 的花费, 所以我们就可以将移动费用理解成先把需要移动到 i 的物品移动到原点, 然后一起移动到 i 工厂

fi=min(fj+ci+(sumpisumpj)xisumpxi+sumpxj)

整理成函数

fj+sumpxj=sumpjxi+fi+sumpxisumpixici

sumpxisumpixici=Ki

fj+sumpxj=sumpjxi+fi+Ki

得到以 sumpj 为自变量, fj+sumpxj 为因变量, xi 为斜率, fi+Ki 为截距的函数

其中, 斜率 xi 单调, 自变量 sumpi 单调, 因变量 fj+sumpxj 单调, 直接用斜率优化

打出代码, 提交时是不开 O2最快代码 (99ms, 最优解第一页唯一没开 O2 的), 开 O2最优解 (76ms)

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;
}
posted @   Wild_Donkey  阅读(62)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示