P4360 [CEOI2004]锯木厂选址
P4360 [CEOI2004]锯木厂选址
这™连dp都不是
\(f_i\)表示第二个锯木厂设在\(i\)的最小代价
枚举1号锯木厂
\(f_i=min_{0<=j<i}(\sum_{i=1}^{n}w_id_i-D_jW_j-D_iW_i+D_iW_j)\)
D为距离后缀和,W为重量前缀和
\(f_i=min_{0<=j<i}(D_iW_j-D_jW_j)+\sum_{i=1}^{n}w_id_i-D_iW_i\)
\(X=D_i,K=W_j,B=-D_jW_j\)

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#define il inline
#define rg register
#define vd void
#define sta static
typedef long long ll;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
struct line{int k,b;};
double operator *(const line&a,const line&b){return(double)(a.b-b.b)/(b.k-a.k);}
line que[20100];
int w[20100],d[20100];
int s[20100],S[20100];
il int get(line&a,int x){return a.k*x+a.b;}
main(){
#ifdef xzz
freopen("4360.in","r",stdin);
freopen("4360.out","w",stdout);
#endif
int n=gi();
for(rg int i=1;i<=n;++i)w[i]=gi(),d[i]=gi();
for(rg int i=n;i;--i)d[i]+=d[i+1];
for(rg int i=1;i<=n;++i)s[i]=w[i]*d[i];
for(rg int i=n;i;--i)S[i]=S[i+1]+s[i];
for(rg int i=1;i<=n;++i)w[i]+=w[i-1];
int hd=0,tl=0,ans=2e9;
que[tl++]=(line){0,0};
for(rg int i=1;i<=n;++i){
while(tl-hd>1&&get(que[hd],d[i])>get(que[hd+1],d[i]))++hd;
ans=std::min(ans,get(que[hd],d[i])+S[1]-w[i]*d[i]);
line x=(line){w[i],-w[i]*d[i]};
while(tl-hd>1&&x*que[tl-1]>que[tl-1]*que[tl-2])--tl;
que[tl++]=x;
}
printf("%lld\n",ans);
return 0;
}
P4360 [CEOI2004]锯木厂选址的更多相关文章
- 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)
传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...
- 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化)
传送门 我可能根本就没有学过斜率优化…… 我们设$dis[i]$表示第$i$棵树到山脚的距离,$sum[i]$表示$w$的前缀和,$tot$表示所有树运到山脚所需要的花费,$dp[i]$表示将第二个锯 ...
- luogu P4360 [CEOI2004]锯木厂选址
斜率优化dp板子题[迫真] 这里从下往上标记\(1-n\)号点 记\(a_i\)表示前缀\(i\)里面树木的总重量,\(l_i\)表示\(i\)到最下面的距离,\(s_i\)表示\(1\)到\(i-1 ...
- 洛谷P4360 [CEOI2004]锯木厂选址(dp 斜率优化)
题意 题目链接 Sol 枚举第二个球放的位置,用前缀和推一波之后发现可以斜率优化 // luogu-judger-enable-o2 #include<bits/stdc++.h> #de ...
- luoguP4360 [CEOI2004]锯木厂选址
题目链接 luoguP4360 [CEOI2004]锯木厂选址 题解 dis:后缀和 sum:前缀和 补集转化,减去少走的,得到转移方程 dp[i] = min(tot - sumj * disj - ...
- 动态规划(斜率优化):[CEOI2004]锯木厂选址
锯木场选址(CEOI2004) 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运.山脚下有 ...
- [BZOJ2684][CEOI2004]锯木厂选址
BZOJ权限题! Description 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运 ...
- cogs 362. [CEOI2004]锯木厂选址
★★★ 输入文件:two.in 输出文件:two.out 简单对比 时间限制:0.1 s 内存限制:32 MB 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来. ...
- LG4360 [CEOI2004]锯木厂选址
题意 原题来自:CEOI 2004 从山顶上到山底下沿着一条直线种植了 n 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个锯木厂 ...
随机推荐
- Django 补充
在Django项目的外面操作这个Django内部的models: 当你创建Django项目的时候你在用的时候,你是在这个Django项目中使用的 那么你怎么在你的这个Django项目的外面使用这个D ...
- KHFlatButton
KHFlatButton https://github.com/kylehorn/KHFlatButton 效果: 对于自己做demo来说,每次设置button就不用这么折腾了,几句话就行了,非常爽: ...
- AC自动机, 字符串匹配算法
package utils import java.util.HashMapimport java.util.LinkedListimport util.control.Breaks._import ...
- Linux 系统的磁盘分区_【all】
磁盘的存储逻辑结构 1.主引导扇区(446+64+2) MBR(主引导记录)0磁头0磁道的第一扇区 446字节 -->存放系统的引导程序,同Windows 剩下的64字节,分区表(每个分区16字 ...
- SpringBoot+MyBatis连接数据库
SpringBoot通过MyBatis连接数据库有2种方法: 1.注解 2.XML文件 1.注解 1.构建项目 2.添加依赖: <dependencies> <dependency& ...
- list(range())--------range创建一个list列表 遍历索引range(len()) 和 list(range())创建列表
lst = list(range(15,26)) #注,list(range())用的是小括号哦print(lst)
- Log4net 使用之 日期字段格式化
Log4net 是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介. 之前Log4net的日期字段Data一直采 ...
- 利用skipList(跳表)来实现排序(待补充)
用于排名的数据结构 一般排序为利用堆排序(二叉树)和利用skipList(跳表)的方式 redis中SortedSet利用skipList(跳表)来实现排序,复杂度为O(logn),利用空间换时间,类 ...
- IKVM.NET入门(2)
ikvm.net是什么 http://www.ikvm.net/ ikvm.net是能够运行在mono和.net framework的java虚拟机.它包括了 在.net中实现的一个java虚拟机 j ...
- mvc, web mvc, spring web mvc 区别
1. MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的 ...