当前位置: 首页 > news >正文

BZOJ 3437 小P的牧场(斜率优化DP)

 

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3437

 

【题目大意】

  n个牧场排成一行,需要在某些牧场上面建立控制站,
  每个牧场上只能建立一个控制站,每个控制站控制的牧场
  是它所在的牧场一直到它西边第一个控制站的所有牧场
  它西边第一个控制站所在的牧场不被控制,如果它西边不存在控制站,
  那么它控制西边所有的牧场,每个牧场被控制都需要一定的花费,
  而且该花费等于它到控制它的控制站之间的牧场数目乘上该牧场的放养量,
  在第i个牧场建立控制站的花费是ai,每个牧场i的放养量是bi,
  求最小总花费。

 

【题解】

  考虑只在n建立控制站的情况,答案为∑b[i]*(n-i)
  记dp[i]为考虑了i到n的情况,并且在i点建立了控制站的最优情况,
  有dp[i]=max{dp[j]+sum[i]*(j-i)}-a[i]
  =-a[i]-sum[i]*i+max(dp[j]+sum[i]*j)
  为关于sum[i]的线性函数,那么对f(y)=x*y+dp[x]进行斜率优化

  正向思路(by安琪):

          

 

 

【代码】

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N=1000010;
int deq[N],n;
LL tot,ans,dp[N],S[N],a[N],b[N];
LL f(int x,LL y){return y*x+dp[x];}
bool check(int f1,int f2,int f3){
    LL a1=f1,b1=dp[f1];
    LL a2=f2,b2=dp[f2];
    LL a3=f3,b3=dp[f3];
    return (a2-a1)*(b3-b2)<=(b2-b1)*(a3-a2);
}
void solve(){
    for(int i=1;i<=n;i++)S[i]=S[i-1]+b[i];
    int s=0,t=1;
    deq[0]=n;
    for(int i=n-1;i;i--){
        while(s+1<t&&f(deq[s],S[i])<=f(deq[s+1],S[i]))s++;
        dp[i]=-a[i]-S[i]*i+f(deq[s],S[i]);
        ans=max(ans,dp[i]); 
        while(s+1<t&&check(deq[t-2],deq[t-1],i))t--;
        deq[t++]=i;
    }printf("%lld\n",tot-ans);
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)scanf("%lld",&b[i]);
    for(int i=1;i<n;i++)tot+=b[i]*(n-i);
    tot+=a[n]; solve();
    return 0;
}

转载于:https://www.cnblogs.com/forever97/p/bzoj3437.html

相关文章:

  • Python+selenium网页模拟操作-自动化
  • oracle模糊查询(二)
  • java Web面试题
  • oracle模糊查询:全文索引方式(三)
  • oracle模糊查询:分区局部全文索引方式(四)
  • 动态链接及静态链接
  • BTrace实战
  • windows下安装配置hadoop
  • JavaScript(jQuery)实现打印英文格式日期
  • eclipse运行hadoop wordcount example
  • linux6.5环境下安装python
  • protobuf-2.5.0的下载与安装
  • ibatis入门
  • 将DataTable转换为ListT对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”。...
  • php无限分类
  • @angular/forms 源码解析之双向绑定
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JavaScript异步流程控制的前世今生
  • JDK 6和JDK 7中的substring()方法
  • js中的正则表达式入门
  • Linux gpio口使用方法
  • MaxCompute访问TableStore(OTS) 数据
  • MySQL数据库运维之数据恢复
  • ng6--错误信息小结(持续更新)
  • scrapy学习之路4(itemloder的使用)
  • Vue全家桶实现一个Web App
  • 百度地图API标注+时间轴组件
  • - 概述 - 《设计模式(极简c++版)》
  • 诡异!React stopPropagation失灵
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 微服务框架lagom
  • 移动端唤起键盘时取消position:fixed定位
  • 异常机制详解
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 自定义函数
  • 如何正确理解,内页权重高于首页?
  • ​虚拟化系列介绍(十)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (11)MSP430F5529 定时器B
  • (ibm)Java 语言的 XPath API
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (九十四)函数和二维数组
  • (三)elasticsearch 源码之启动流程分析
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十三)Flask之特殊装饰器详解
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)母版页和相对路径
  • (转)我也是一只IT小小鸟
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NetCore项目nginx发布
  • .NET中GET与SET的用法