书架 bookshelf

书架 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*4];
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*2,v);update(k*2+1,v);v=0;}
}
void wh(int k){tr[k].f=min(tr[k*2].f,tr[k*2+1].f);tr[k].mi=min(tr[k*2].mi,tr[k*2+1].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>>1;build(k*2,l,mid);build(k*2+1,mid+1,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>>1;if(li<=mid)ch(k*2,l,mid,li,ri,v);if(ri>mid)ch(k*2+1,mid+1,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>>1;ll tmp=inf;if(li<=mid)tmp=min(tmp,ask(k*2,l,mid,li,ri));if(ri>mid)tmp=min(tmp,ask(k*2+1,mid+1,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>>1;if(pl<=mid)add(k*2,l,mid,pl,v);else add(k*2+1,mid+1,r,pl,v);wh(k);
}
int main(){cin>>n>>len;for(int i=1;i<=n;i++){scanf("%lld%lld",&h[i],&w[i]);w[i]+=w[i-1];}int la=0;build(1,0,n);for(int i=1;i<=n;i++){while(top&&h[i]>zh[top])top--;//cout<<"ch "<<id[top]<<' '<<i-1<<endl;ch(1,0,n,id[top],i-1,h[i]);while(w[i]-w[la]>len)la++;//cout<<"la "<<la<<endl;fn=ask(1,0,n,la,i-1);//cout<<fn<<endl;add(1,0,n,i,fn);zh[++top]=h[i];id[top]=i;}cout<<fn<<endl;return 0;
}

View Code

posted @ 2019-02-15 16:05 liankewei 阅读(...) 评论(...) 编辑 收藏

书架 bookshelf相关推荐

  1. 书架bookshelf

    第一题 书架 [问题描述] 为了方便同学们查阅资料,程序设计兴趣小组的辅导老师打算将积攒了很多年的n本书放到上课教室的书架上去. 教室的书架是一层一层叠起来的,每一层最多可以放m本书.每一层的高度由放 ...

  2. [USACO12OPEN]书架Bookshelf

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

  3. [慈溪2012]书架(bookshelf)

    题目描述 为了方便同学们查阅资料,程序设计兴趣小组的辅导老师打算将积攒了很多年的n本书放到上课教室的书架上去. 教室的书架是一层一层叠起来的,每一层最多可以放m本书.每一层的高度由放在这层中最高的那本 ...

  4. 洛谷P1848 [USACO12OPEN]书架Bookshelf

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

  5. python3爬小说_python3小说爬虫

    作为一个很喜欢看书的人,有时候在网页上看小说,会被数不胜数的广告弄的很烦,刚好最近在研究python,就自己写了一个小说爬虫,并用pyqt做了图形界面. 下面介绍一下主要思路,不过就不开源了,因为我的 ...

  6. 每日学一个设计模式1——迭代器模式

    引言 精通设计模式是从码农脱颖而出的条件之一.跟着<图解设计模式>这本书学习设计模式,从今天开始,一天总结一个设计模式. 迭代器模式(一个一个遍历) 用处 隐藏遍历集合的内部结构,遍历不同 ...

  7. 我的世界常用命令和物品名称

    显示玩家坐标: /gamerule showcoordinates true 是显示玩家坐标的指令 区域填充: /fill 坐标 坐标 物品 物品大全: https://minecraft.52pk. ...

  8. python爬虫小说系统_python3小说爬虫

    作为一个很喜欢看书的人,有时候在网页上看小说,会被数不胜数的广告弄的很烦,刚好最近在研究python,就自己写了一个小说爬虫,并用pyqt做了图形界面. 下面介绍一下主要思路,不过就不开源了,因为我的 ...

  9. POJ 3628 Bookshelf 2

    POJ 3628 Bookshelf 2:http://poj.org/problem?id=3628 题意:有个书架,高度为B,现在FJ有N个奶牛,每个奶牛有个高度hi,现在将奶牛堆起来,使得堆起来 ...

最新文章

  1. node项目架构与优化
  2. C++中基于Crt的内存泄漏检测
  3. 基于Jenkins的持续交付全流程设计与实践
  4. Bootstrap-组件-2
  5. 3.4_activity_selection_活动选择问题
  6. 欧盟委员会支持5个开源项目漏洞奖励计划,奖金池20万欧元
  7. switch语句的基本使用
  8. 蓝桥杯2021国赛太原理工大学获得14枚奖牌
  9. windows中使用docker构建镜像
  10. 干货 | Modbus协议调试分享
  11. Win10 安装 JDK1.8 及配置环境变量
  12. 上海地区房价影响因素预测
  13. MyBatisplus字段名与表名的映射
  14. 国务院《新能源汽车产业发展规划(2021—2035年)》
  15. 520送男朋友什么礼物最好、送男友礼物清单
  16. 用Python画等边三角形
  17. composer php 扩展,正确的Composer扩展包安装方法
  18. web怎么将dwg转换图片_怎么将DWG图纸转换成JPG格式图片
  19. python容器结构 —— list - 列表篇 看这一篇就够了!
  20. 人工智能伦理学的一知半解

热门文章

  1. 2021好看的新年雪花飘倒计时单页网站源码分享
  2. 二见钟情之组合查询(vb.net版)
  3. 如何使用Visual Studio 2005画一张正规的国旗图片
  4. Unity 3D模型展示框架篇之框架运用
  5. ORACLE中RECORD的使用
  6. 2022-2028全球与中国智能家居解决方案市场现状及未来发展趋势
  7. Sentinel第二篇:降级
  8. antv/G2 v4使用遇坑之旅
  9. 课程设计:通讯录系统(数据库)
  10. sci期刊发表文章注意事项