• Wood Processing牛客第十场 斜率优化DP


    卧槽我感觉写的是对的,但是就是样例都过不了。。。留坑

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define LL long long
    using namespace std;
    const int maxx = 5005;
    struct node{
      int h,w;
    }p[maxx];
    LL dp[maxx][2005];
    LL sums[maxx];
    LL sumw[maxx];
    LL que[maxx];
    bool cmp(node a,node b){
      return a.h<b.h;
    }
    LL Y(int k,int j){
      return dp[k][j-1]-sums[k]+(LL)sums[k]*p[k+1].h;
    }
    LL KY(int j,int k1,int k2){
      return Y(k1,j)-Y(k2,j);
    }
    LL X(int k){
       return p[k+1].h;
    }
    LL KX(int i,int j){
       return X(i)-X(j);
    }
    int main(){
      int n,K;
      while(~scanf("%d%d",&n,&K)){
          sums[0]=0;
          sumw[0]=0;
          for (int i=1;i<=n;i++){
             scanf("%d%d",&p[i].w,&p[i].h);
          }
          memset(dp,0,sizeof(dp));
          sort(p+1,p+1+n,cmp);
          for (int i=1;i<=n;i++){
             sums[i]=(LL)sums[i-1]+p[i].w*p[i].h;
             sumw[i]=(LL)sumw[i-1]+p[i].w;
             dp[i][1]=sums[i]-(LL)sumw[i]*p[1].h;
          }
          int l,r;
          l=r=1;
          for (int j=2;j<=K;j++){
              l=r=1;
              que[1]=0;
              dp[j][j]=0;
              for (int i=1;i<=n;i++){
                while(l<r && KY(j,que[l+1],que[l])<=sumw[i]*KX(que[l+1],que[l]))l++;
                dp[i][j]=dp[que[l]][j-1]+sums[i]-sums[que[l]]-(sumw[i]-sumw[que[l]])*p[que[l]+1].h;
                while(l<r && KY(j,que[r],que[r-1])*KX(i,que[r])>=KY(j,i,que[r])*KX(que[r],que[r-1]))r--;
                que[++r]=i;
              }
          }
    //      for (int i=1;i<=n;i++){
    //        for (int j=1;j<=K;j++){
    //            cout<<dp[i][j]<<" ";
    //        }
    //      }
          printf("%lld
    ",dp[n][K]);
      }
      return 0;
    }
    有不懂欢迎咨询 QQ:1326487164(添加时记得备注)
  • 相关阅读:
    如何清除el-dialog中的表单验证
    购物车小球飞入动画
    node的应用场景
    如何在Ubuntu Server 18.04 LTS中配置静态IP地址
    在Ubuntu上启用和禁用NetworkManager
    gcc常用命令
    cmake入门
    模拟实现pwd命令
    模拟实现ls命令
    qmake生成的Makefile在make install时遇到的一次错误
  • 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/11396043.html
Copyright © 2020-2023  润新知