洛谷P4360 [CEOI2004]锯木厂选址(斜率优化)
2024-09-28 02:49:37
我可能根本就没有学过斜率优化……
我们设$dis[i]$表示第$i$棵树到山脚的距离,$sum[i]$表示$w$的前缀和,$tot$表示所有树运到山脚所需要的花费,$dp[i]$表示将第二个锯木厂建在$i$的最小花费
那么状态转移方程就是$$dp[i]=min\{tot-dis[j]*sum[j]-dis[i]*(sum[j]-sum[i])\}$$
然后考虑斜率优化,设$j$比$k$更优,则(一堆乱七八糟的推导之后)有$$\frac{sum[j]*dis[j]-sum[k]-dis[k]}{sum[j]-sum[k]}>dis[i]$$
那么只要考虑维护一个上凸包就可以了
//minamoto
#include<iostream>
#include<cstdio>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,:;}
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=;
int sum[N],dis[N],w[N],q[N],dp[N],n,h,t,tot,ans=0x3f3f3f3f;
inline double slope(int j,int k){
return ((sum[j]*dis[j])-(sum[k]*dis[k]))*1.0/(sum[j]-sum[k]);
}
inline int calc(int i,int j){
return tot-sum[j]*dis[j]-dis[i]*(sum[i]-sum[j]);
}
int main(){
//freopen("testdata.in","r",stdin);
n=read();
for(int i=;i<=n;++i) w[i]=read(),dis[i]=read();
for(int i=n;i;--i) dis[i]+=dis[i+];
for(int i=;i<=n;++i) sum[i]=sum[i-]+w[i],tot+=w[i]*dis[i];
for(int i=;i<=n;++i){
while(h<t&&slope(q[h],q[h+])>dis[i]) ++h;
cmin(ans,calc(i,q[h]));
while(h<t&&slope(q[t],q[t-])<slope(q[t-],i)) --t;q[++t]=i;
}
printf("%d\n",ans);
return ;
}
最新文章
- Maven个人手册
- 远程实时调试手机上的Web页面
- 今天来做一个PHP电影小爬虫。
- Cache的Add之委托解说
- js基础 - 兼容代码
- Nutch配置
- asp.net内置对象session和cookie
- AndroidContentProvider ContentResolver和ContentObserver的使用
- Lock与synchronized 的区别
- Oracle教程-常用命令(二)
- linux管道(|)与重定向(<;>;)的异同
- flask配置管理
- Oracle 11g数据库安装和卸载教程
- 用js来实现那些数据结构08(链表02-双向链表)
- PMP知识点(六)&mdash;&mdash;项目经理权利类型
- main方法启动spring
- https协议详解
- nodejs:导出Excel和解析导入的Excel
- mysql 不允许分组的问题
- VBscript实现开机自动启动,自动复制原件后启动
热门文章
- DotNetBar笔记
- Nunit 2.6 无法调试.Net Framework 4.0
- 【转】LTE 全过程流程
- demo2 Kafka+Spark Streaming+Redis实时计算整合实践 foreachRDD输出到redis
- Java-API-Package:org.springframework.stereotype
- Excel开发学习笔记:读取xml文件及csv文件
- pl/sql对excel数据的导入和导出
- mybatis中in查询
- python爬虫框架(1)--框架概述
- if __name__ == ";__main__";: 的使用