首页 > 其他分享 >[lnsyoj539/luoguP2120/ZJOI2007]仓库建设

[lnsyoj539/luoguP2120/ZJOI2007]仓库建设

时间:2024-08-07 20:38:47浏览次数:9  
标签:return int sum sump luoguP2120 lnsyoj539 ZJOI2007 include LL

题意

懒了(

sol

显然 DP
设计状态:\(f_i\) 表示 \(1\sim i\) 的工厂中,在第 \(i\) 个工厂处建设仓库的最小代价;
状态转移:由题意,显然可得:

\[f_i = \min_{j=1}^{i-1} \{f_j + c_i + \sum_{k=j+1}^i(x_i-x_k)\cdot p_k\} \]

我们发现中间的一坨求和可以通过前缀和的方式预处理出 \(sum_i=\sum_{j=1}^i x_i\cdot p_i\) 和 \(sump_i=\sum_{j=1}^i p_i\),这样原式就转化为了

\[f_i = \min_{j=1}^{i-1} \{f_j + c_i + x_i \cdot (sump_i - sump_j) - (sum_i - sum_j)\} \]

时间复杂度 \(O(n^2)\)。
显然,我们可以将其进行斜率优化,具体参见[lnsyoj538/luoguP3628/APIO2010]特别行动队。本题与该题在优化上无明显区别,仅是将上凸包修改为了下凸包。
本题需要注意,由于在最后可能出现 \(p_i =0\) 的情况,因此我们需要将末尾所有的连续的 \(p_i=0\) 的结果求最小值即可。

代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
typedef long long LL;

const int N = 1000005;

LL xx[N], sum[N], sump[N], c[N], f[N];
int n;
int q[N];

LL x(int u){
    return sump[u];
}

LL y(int u){
    return f[u] + sum[u];
}

double slope(int a, int b){
    return (double) (y(b) - y(a)) / (x(b) - x(a));
}

int main(){
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ ) scanf("%d%d%d", &xx[i], &sump[i], &c[i]), sum[i] = sum[i - 1] + sump[i] * xx[i], sump[i] += sump[i - 1];
    
    int hh = 0, tt = 0;
    for (int i = 1; i <= n; i ++ ){
        while (hh < tt && slope(q[hh], q[hh + 1]) <= xx[i]) hh ++ ;
        int j = q[hh];
        f[i] = f[j] - (sum[i] - sum[j]) + xx[i] * (sump[i] - sump[j]) + c[i];
        while (hh < tt && slope(q[tt], i) <= slope(q[tt - 1], q[tt])) tt -- ;
        q[ ++ tt] = i;
    }

    LL res = f[n];
    for (int i = n; i == n || sump[i + 1] == sump[i]; i -- ) res = min(f[i], res);

    printf("%lld\n", res);

    return 0;
}

标签:return,int,sum,sump,luoguP2120,lnsyoj539,ZJOI2007,include,LL
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/lnsyoj539_luoguP2120

相关文章

  • P2120 [ZJOI2007] 仓库建设
    题目大意\(n\)个工厂,每个工厂有\(p_i\)的货物,货物运输一个单位距离的费用是\(1\),工厂可以建造仓库,费用为\(c_i\)。工厂与工厂\(1\)的距离为\(x_i\)。要求将货物运送到下一个最近的仓库,求最小费用。\(1\leqn\leq10^6\)思路先考虑最基本的动规:设\(f_i\)表示在这里......
  • Luogu P1110 [ZJOI2007] 报表统计
    题目描述给定一个长度为\(n\)的整数序列\(a\),有以下三种操作:INSERTix:\(i\)位置后面添加一个新元素\(x\),下一个元素挂在这个元素后面。MIN_GAP:查询相邻元素差值的最小值。MIN_SORT_GAP:查询元素中最接近的两个元素的差值。题目解析平衡树经典题目。建立\(2\)棵平衡......
  • C138 线段树分治 P2056 [ZJOI2007] 捉迷藏
    视频链接:C138线段树分治P2056[ZJOI2007]捉迷藏_哔哩哔哩_bilibili   P2056[ZJOI2007]捉迷藏-洛谷|计算机科学教育新生态(luogu.com.cn)//线段树分治O(nlognlogn)#include<iostream>#include<cstring>#include<algorithm>#include<vector>#inclu......
  • P1110 [ZJOI2007] 报表统计 题解
    考察点:STL的熟练运用。记:\(l_i\)表示序列中不超过\(a_i\)的最大数,\(r_i\)表示序列中超过\(a_i\)的最小数。开一个vectorinsert[N]存储\(a_i\)后面插入的所有数字。首先,我们使用一个multisets1来存储相邻元素的差的绝对值,然后再开一个multisets2来存储当前出......
  • P1129 [ZJOI2007] 矩阵游戏 建模部分
    link题解没一个说为什么能用最小割的...(当然可能是只有我不知道)设交换后行、列数相同的第\(x\)行和第\(y\)列(\(x,y\)为原始位置),发现它们的交点现在位于\((i,i)\),原来位于\((x,y)\)。因为无论怎么交换位置,原来的交点仍是交点。所以可以得出一个构造方案:先选定\(n\)个点......
  • 斜率优化 [ZJOI2007] 仓库建设
    [ZJOI2007]仓库建设题目描述L公司有\(n\)个工厂,由高到低分布在一座山上,工厂\(1\)在山顶,工厂\(n\)在山脚。由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用。突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于......
  • P1129 [ZJOI2007] 矩阵游戏
    挺喜欢的一题。首先我们很容易观察到一个性质:每一行和每一列上的黑色方格的数量是不变的,只能改变它在那一行和那一列的排列顺序。由此若是有某一行或某一列上没有黑色方格,直接输出No即可。此时我们考虑的情况就是每一行和每一列上至少都会有一个黑色方格。这时有一个结论:若有......
  • [ZJOI2007]报表统计
    P1110[ZJOI2007]报表统计考虑到操作MIN_SORT_GAP比较简单,用一个set维护前驱后继即可,重点关注INSERT,MIN_GAP。发现我们可以先开一个单链表来存储所有数,开数组表示原数列的第\(i\)个元素现在的位置。每次插入只需要在对应位置插入,然后更新数组的值。关于维护最小差值,用......
  • P1131 [ZJOI2007] 时态同步
    P1131[ZJOI2007]时态同步-洛谷|计算机科学教育新生态(luogu.com.cn)这更多是一个思维题   看到上面这副图,我们的想法是先让1→2和1→3拉伸到1→4的深度,再......
  • 「ZJOI2007」仓库建设
    「ZJOI2007」仓库建设题意:有\(n\)个工厂,由高到底分布在一座山上,工厂\(1\)在山顶,工厂\(n\)在山脚,第\(i\)个工厂有\(p_i\)件产品,距离工厂\(1\)的距离为\(x_i\)......