zoukankan      html  css  js  c++  java
  • BZOJ1096[ZJOI2007]仓库建设

    BZOJ1096-[ZJOI2007]仓库建设

      题意:

      题解:

        斜率优化dp.为啥我做过的斜率优化题没有一道是1A的???还有这道题并不难,就当我试一下mathjax吧.

        我们设$tot_{i}=\sum_{j=1}^ip_j$和$sum_i=\sum_{j=1}^ix_j*p_j$,

        则我们很容易得到一个dp方程$f_i=max(f_j+x_i*(tot_i-tot_j)-(sum_i-sum_j))+c_i$(自己体会下)

        化一下就变成$f_i=max(f_j+sum_j-x_i*tot_j)+x_i*tot_i-sum_i+c_i$,

        则对于$j>k$,选j比选k优的条件是$f_j+sum_j-x_i*tot_j<f_k+sum_k-x_i*tot_k$,

        然后这个式子再化一下变成$\frac{(f_j+sum_j)-(f_k+sum_k)}{tot_j-tot_k}<x_i$,

        然后随意斜率优化一下就好了.

        不要说我没讲仔细,我并不是来写题解的,我只是来试试mathjax的.

        (还有有没有觉得我的公式特别小啊,我也不知道怎么回事)

        (是不是觉得上一篇志愿者招募的题解没用mathjax特别丑啊,反正我也懒得改成mathjax了,反正也没多少人看)

    #include<cstdio>
    typedef long long ll;
    const int maxn=1000000;
    int n; ll x[maxn+10],p[maxn+10],c[maxn+10],sum[maxn+10],tot[maxn+10],f[maxn+10];
    int q[maxn+10],l,r;
    ll up_f(int k,int j){
        return f[j]+sum[j]-f[k]-sum[k];
    }
    ll down_f(int k,int j){
        return tot[j]-tot[k];
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;++i) scanf("%lld%lld%lld",&x[i],&p[i],&c[i]);
        for(int i=1;i<=n;++i){
            tot[i]=tot[i-1]+p[i]; sum[i]=sum[i-1]+p[i]*x[i];
        }
        for(int i=1;i<=n;++i){
            for(;l<r&&up_f(q[l],q[l+1])<=x[i]*down_f(q[l],q[l+1]);++l);
            f[i]=f[q[l]]+sum[q[l]]-x[i]*tot[q[l]]+x[i]*tot[i]-sum[i]+c[i];
            for(;l<r&&up_f(q[r],i)*down_f(q[r-1],q[r])<=up_f(q[r-1],q[r])*down_f(q[r],i);--r); q[++r]=i;
        }
        printf("%lld",f[n]);  return 0;
    }
  • 相关阅读:
    LamBda学习(一)
    如何返回一个只读泛型集合
    Socket编程笔记同步
    如何快速读取大文件(看csdn一网友要求写的)没有测试具体的速度。
    如何实现项目脚本的批量生成
    如何实现WORD查找完成后不提示的代码
    W32/Pate.a 病毒处理小记
    在WORD中用VBA实现光标移动与内容选择
    2. WCF 消息操作
    3. WCF 异常处理
  • 原文地址:https://www.cnblogs.com/jxcakak/p/7617630.html
Copyright © 2011-2022 走看看