书架 bookshelf

题目描述

当Farmer John闲下来的时候,他喜欢坐下来读一本好书。 多年来,他已经收集了N本书 (1 <= N <= 100,000)。 他想要建立一个多层书架,来存放它们。

每本书 i 拥有一个宽度 W(i)和一个高度 H(i)。 所有的书需要按顺序,放到书架的每一层。 举例来说,第一层书架放k本书,应该放书1...k;第二层书架从第k+1本书开始放……。 每层书架的宽度最多为L (1 <= L <= 1,000,000,000)。 每层书架的高度为该层最高的那本书的高度。 书架的总高度为每层书架高度的和。

请帮FJ计算书架可能的最小总高度。

输入

第1行:两个空格隔开的整数:N和L 
第2行..第N+1行:第i+1行包含两个空格隔开的整数:H(i) 和 W(i) 。(1 <= H(i) <= 1,000,000; 1 <= W(i) <= L)。

输出

仅一行,表示书架可能的最小总高度

样例输入

5 10
5 7
9 2
8 5
13 2
3 8

样例输出

21

提示

【样例解释】

一共有5本书。每层书架的宽度最多为10。

3层书架,第1层放书1(高5,宽7),第2层放书2..4(高13,宽9),第3层放书5(高3,宽8)。

【数据范围】

45%的数据:1<=N<=5,000

100%的数据:1<=N<=100,000,1<=Wi<=L<=1,000,000,000,1<=Hi<=1,000,000


solution

考虑暴力dp

f[i]表示放好前i本书的最小高度。

f[i]=min (f[j]+max(h[j+1]--h[i])) (w[i]-w[j]<=L)

效率O(n^2)

现在优化时间复杂度。

枚举右端点r,我们维护最靠前的可转移位置l。

也就是我要知道[l,r]内f[i]+maxh[i~r]的最小值

由于f不变,h可能变(而且是整段改变),我们用线段树维护。

f相当于单点加,而h则是区间修改。

分别维护f的最小值和f+h的最小值,改变h时用旧的f与新的h更新f+h即可。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 100005
#define inf 1e16
#define ll long long
using namespace std;
int n,id[maxn],top;
ll w[maxn],h[maxn],zh[maxn],len,fn;
struct node{
ll f,bj,mi;
}tr[maxn*];
void update(int k,ll v){
tr[k].bj=v;tr[k].mi=tr[k].f+v;
}
void down(int k){
if(tr[k].bj){
ll &v=tr[k].bj;
update(k*,v);update(k*+,v);
v=;
}
}
void wh(int k){
tr[k].f=min(tr[k*].f,tr[k*+].f);
tr[k].mi=min(tr[k*].mi,tr[k*+].mi);
}
void build(int k,int l,int r){
if(l==r){
if(l) tr[k].f=tr[k].mi=inf;
return;
}
int mid=l+r>>;
build(k*,l,mid);build(k*+,mid+,r);
wh(k);
}
void ch(int k,int l,int r,int li,int ri,ll v){
if(l>=li&&r<=ri){
update(k,v);return;
}
down(k);
int mid=l+r>>;
if(li<=mid)ch(k*,l,mid,li,ri,v);
if(ri>mid)ch(k*+,mid+,r,li,ri,v);
wh(k);
}
ll ask(int k,int l,int r,int li,int ri){
if(l>=li&&r<=ri){
return tr[k].mi;
}
down(k);
int mid=l+r>>;
ll tmp=inf;
if(li<=mid)tmp=min(tmp,ask(k*,l,mid,li,ri));
if(ri>mid)tmp=min(tmp,ask(k*+,mid+,r,li,ri));
return tmp;
}
void add(int k,int l,int r,int pl,ll v){
if(l==r){ tr[k].f=v;return;
}
down(k);
int mid=l+r>>;
if(pl<=mid)add(k*,l,mid,pl,v);
else add(k*+,mid+,r,pl,v);
wh(k);
}
int main(){ cin>>n>>len;
for(int i=;i<=n;i++){
scanf("%lld%lld",&h[i],&w[i]);
w[i]+=w[i-];
}
int la=;
build(,,n);
for(int i=;i<=n;i++){
while(top&&h[i]>zh[top])top--;
//cout<<"ch "<<id[top]<<' '<<i-1<<endl;
ch(,,n,id[top],i-,h[i]);
while(w[i]-w[la]>len)la++;
//cout<<"la "<<la<<endl;
fn=ask(,,n,la,i-);
//cout<<fn<<endl;
add(,,n,i,fn);
zh[++top]=h[i];id[top]=i;
}
cout<<fn<<endl;
return ;
}

书架 bookshelf的更多相关文章

  1. [USACO12OPEN]书架Bookshelf

    Description 当农夫约翰闲的没事干的时候,他喜欢坐下来看书.多年过去,他已经收集了 N 本书 (1 <= N <= 100,000), 他想造一个新的书架来装所有书. 每本书 i ...

  2. [Luogu1848][USACO12OPEN]书架Bookshelf DP+set+决策单调性

    题目链接:https://www.luogu.org/problem/show?pid=1848 题目要求书必须按顺序放,其实就是要求是连续的一段.于是就有DP方程$$f[i]=min\{f[j]+m ...

  3. p1848 [USACO12OPEN]书架Bookshelf

    分析 单调队列优化dp即可 正确性显然,详见代码 代码 #include<bits/stdc++.h> using namespace std; #define int long long ...

  4. Java设计模式学习记录-迭代器模式

    前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...

  5. English trip -- VC(情景课)10 B Around the house 在家里

    Vocablulary focus  核心词汇 cook play the guitar listen to music watch TV read magazines work in the gar ...

  6. Python之Django的Model详解

    一.创建数据库 创建数据库 进入数据库: mysql -uroot -p 创建数据库: CREATE DATABASE test1 CHARSET=utf8; 连接数据库 虚拟环境中安装数据库模块:p ...

  7. pkuwc 前的任务计划

    菜鸡 wxw 的计划(肯定会咕咕咕 12.27 luogu P4244 [SHOI2008]仙人掌图 II(咕咕咕 luogu P4246 [SHOI2008]堵塞的交通 (没有咕! luogu P1 ...

  8. 设计模式——迭代器(Iterator)模式

    概述 迭代器模式简单的说(按我目前的理解)就是一个类提供一个对外迭代的接口,方面调用者迭代.这个迭代接口至少包括两个方法:hasNext()--用于判断是否还有下一个,next()--用于取出下一个对 ...

  9. XStream的基本使用

    先准备两个bean public class Book { private int bookId; private String bookName; private String bookCode; ...

随机推荐

  1. mysql 从 frm 文件恢复 table 表结构的3种方法

    mysql 正常运行的时候,查看 table 的结构并不是困难的事. 但是有时 mysql 发生故障,这种方法便不再可行. 当遇到故障,通常使用新的 mysql 实例来恢复当前的数据. 建表是非常重要 ...

  2. day23 正则,re模块

    一. 简谈正则表达式 元字符 . 除了换行符外任意字符. \w 数字.字母.下划线 \s 空白符 \b 单词的末尾 \d 数字 \n 匹配换行符 \t 匹配制表符 \W 除了数字. 字母 下划线 \D ...

  3. React Native (0.57)开发环境搭建(注意:Node不要随便更新到最新版,更新完后莫名其妙的问题一大堆)

    搭建开发环境 一.安装依赖 必须安装的依赖有:Node.Watchman 和 React Native 命令行工具以及 Xcode. 1.首先安装 Homebrew 2.安装 Node, Watchm ...

  4. HTML和CSS <h1> --2-- <h1>

    认识html文件基本结构 这一节中我们来学习html文件的结构:一个HTML文件是有自己固定的结构的. <html> <head>...</head> <bo ...

  5. Teamwork(The second day of the team)

    梦之翼 5.20工作汇报: Master:杨灵超 产品负责人:杨家安 第一次Sprint的目标和时间: 目标:这一次的sprint我们想先做成一个可以运行的可以展示,但是功能或许还不是很完善的一个模型 ...

  6. 2018软工实践第八次作业-团队项目UML设计

    团队信息 队员姓名与学号 学号 姓名 博客链接 124 王彬(组长) 点击这里 206 赵畅 点击这里 215 胡展瑞 点击这里 320 李恒达 点击这里 131 佘岳昕 点击这里 431 王源 点击 ...

  7. golang string转json的一些坑

    先带来点冷知识,不知道大家知不知道,反正我刚知道... 大佬们都知道怎么在string中给string类型赋值带双引号的字符串,没错就是用反斜杠,如下: msg := "{\"na ...

  8. 车牌识别算法库EasyPR的使用

    主要参考以下两个博客: http://blog.csdn.net/junmuzi/article/details/49888123 http://blog.csdn.net/Lucas66666/ar ...

  9. Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型

    条款4:了解如何观察推导出的类型 那些想要知道编译器推导出的类型的人通常分为两种,第一种是实用主义者,他们的动力通常来自于软件产生的问题(例如他们还在调试解决中),他们利用编译器进行寻找,并相信这个能 ...

  10. IE盒模型与W3C盒模型区别

    前两天被人问到,叫我解释一下标准盒模型与IE盒模型,额,当时只能说,知道一点,但是没有深入的去探讨过,所以下来之后就自己写了例子,亲自去验证并且查看了网上的一些资料,现将其整理如下: 一.css盒模型 ...