首先将所有高度乘上10,设f[i]为将前i本书放入书架的最小高度,则

\[\begin{eqnarray*}
f[i]&=&\min(f[j-1]+first(j,i)+second(j,i)+W-(s[i]-s[j-1]))\\
&=&\min(f[j-1]+first(j,i)+second(j,i)+W-s[i]+s[j-1])\\
&=&\min(f[j-1]+first(j,i)+second(j,i)+s[j-1])+W-s[i]
\end{eqnarray*}\]

其中$1\leq j\leq i$且$s[i]-s[j-1]\leq W$。

设tmp[i][j]=f[j-1]+s[j-1]+first(j,i)+second(j,i),考虑用线段树维护tmp[i][j],如果当前要计算f[i],那么线段树的第j个叶子节点就表示tmp[i][j]。

为了高效维护first和second,先将所有书按高度排序,从大到小插入到set中。

假设现在插入的是第x本书,那么对于[pre(x)+1,x]内的i,first(i,x)均为a[x]。

对于[pre(pre(x))+1,pre(x)]内的i,以及[x,nxt(x)-1]内的j,second(i,j)均为a[x]。

对于[pre(x)+1,x]内的i,以及[nxt(x),nxt(nxt(x))-1]内的j,second(i,j)也均为a[x]。

于是在右端点的最小值处进行区间赋值操作即可。

时间复杂度$O(n\log n)$。

#include<cstdio>
#include<algorithm>
#include<set>
#define N 300010
using namespace std;
typedef long long ll;
int n,w,i,j,k,c[N],l[N],g[N],vl[N<<1],vr[N<<1],nxt[N<<1],ed;ll a[N],b[N],vw[N<<1],f;
set<int>T;set<int>::iterator it;
inline bool cmp(int x,int y){return a[x]<a[y];}
inline int get(){char c;while(!(((c=getchar())>='0')&&(c<='9')));int a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';return a;}
inline void add(int x,int l,int r,ll w){vl[++ed]=l;vr[ed]=r;vw[ed]=w;nxt[ed]=g[x];g[x]=ed;}
struct node{ll v1,v2,vc,v,t1,t2;}S[1050000];
inline void tag1(int x,ll p){
S[x].v1=p+S[x].vc;
S[x].v=p+S[x].v2;
S[x].t1=p;
}
inline void tag2(int x,ll p){
S[x].v2=p+S[x].vc;
S[x].v=p+S[x].v1;
S[x].t2=p;
}
inline void pb(int x){
if(S[x].t1){
tag1(x<<1,S[x].t1);
tag1(x<<1|1,S[x].t1);
S[x].t1=0;
}
if(S[x].t2){
tag2(x<<1,S[x].t2);
tag2(x<<1|1,S[x].t2);
S[x].t2=0;
}
}
inline void up(int x){
S[x].v1=min(S[x<<1].v1,S[x<<1|1].v1);
S[x].v2=min(S[x<<1].v2,S[x<<1|1].v2);
S[x].vc=min(S[x<<1].vc,S[x<<1|1].vc);
S[x].v=min(S[x<<1].v,S[x<<1|1].v);
}
void same1(int x,int a,int b,int c,int d,ll p){
if(c<=a&&b<=d){tag1(x,p);return;}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)same1(x<<1,a,mid,c,d,p);
if(d>mid)same1(x<<1|1,mid+1,b,c,d,p);
up(x);
}
void same2(int x,int a,int b,int c,int d,ll p){
if(c<=a&&b<=d){tag2(x,p);return;}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)same2(x<<1,a,mid,c,d,p);
if(d>mid)same2(x<<1|1,mid+1,b,c,d,p);
up(x);
}
void change(int x,int a,int b,int c,ll p){
if(a==b){
S[x].vc=p;
S[x].v1=p+S[x].t1;
S[x].v2=p+S[x].t2;
S[x].v=p+S[x].t1+S[x].t2;
return;
}
pb(x);
int mid=(a+b)>>1;
c<=mid?change(x<<1,a,mid,c,p):change(x<<1|1,mid+1,b,c,p);
up(x);
}
ll ask(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return S[x].v;
pb(x);
int mid=(a+b)>>1;ll t=1LL<<60;
if(c<=mid)t=ask(x<<1,a,mid,c,d);
if(d>mid)t=min(t,ask(x<<1|1,mid+1,b,c,d));
return up(x),t;
}
int main(){
n=get(),w=get();
for(i=1;i<=n;i++)a[i]=10LL*get(),b[i]=b[i-1]+get(),c[i]=i;
for(sort(c+1,c+n+1,cmp),T.insert(0),T.insert(n+1),i=n;i;i--){
T.insert(c[i]);
it=T.find(c[i]);
it--,j=*it,l[c[i]]=*it+1;
if(j)it--,add(c[i],*it+1,j,a[c[i]]);
it=T.find(c[i]);
it++,j=*it;
if(j<=n)add(j,l[c[i]],c[i],a[c[i]]);
}
for(i=j=1;i<=n;i++){
same1(1,1,n,l[i],i,a[i]);
same2(1,1,n,i,i,a[i]);
for(k=g[i];k;k=nxt[k])same2(1,1,n,vl[k],vr[k],vw[k]);
while(b[i]-b[j-1]>w)j++;
f=ask(1,1,n,j,i)+w-b[i];
if(i<n)change(1,1,n,i+1,f+b[i]);
}
return printf("%lld.%d",f/10,f%10),0;
}

  

BZOJ4268 : 小强的书架的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. [BZOJ1861][Zjoi2006]Book 书架

    [BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...

  3. Android分享一款漂亮的折叠书架菜单

    一个Android折叠书架菜单,效果极佳,给人的视觉感觉很好,便于使用. FoldingMenu

  4. [转载]我的Java后端书架 (2016年暖冬4.0版)

      [转载]我的Java后端书架 (2016年暖冬4.0版) ps:最近正在初学Java,有一些其他语言的底子,但是还是要好好看书,好好练习,网上找了好久,都没有这份书单来的实用,特意转载过来,方便以 ...

  5. BZOJ 1861: [Zjoi2006]Book 书架

    1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1290  Solved: 740[Submit][Stat ...

  6. 基于HT的CSG功能构建HTML5的3D书架

    构造实体几何CSG全称Constructive solid geometry,是3D计算机图形学中构建模型的常用技术,可通过合并Union.相减Subtraction和相交Intersction的三种 ...

  7. 【代码笔记】iOS-点击加号增加书架,点击减号减少书架

    一,效果图. 二,工程图. 三,代码. ReaderViewController.h #import <UIKit/UIKit.h> @interface ReaderViewContro ...

  8. 【BZOJ-1926】粟粟的书架 二分 + 前缀和 + 主席树

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec  Memory Limit: 552 MBSubmit: 616  Solved: 238[Submit][Statu ...

  9. BZOJ 1861: [Zjoi2006]Book 书架 splay

    1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ...

随机推荐

  1. node.js通过edge访问.net动态链接库

    从了解node.js到现在经历了几个月时间,一直忙于实际的项目,没有动手写点关于node.js的代码.最近将开发工作安排就绪,个人的时间相对从容了,所以这几天开始测试一下node.js. 多年来,一直 ...

  2. poj 2438 Children's Dining

    http://poj.org/problem?id=2438 题意: 有2*N个人要坐在一张圆桌上吃饭,有的人之间存在敌对关系,安排一个座位次序,使得敌对的人不相邻. 假设每个人最多有N-1个敌人.如 ...

  3. Java SSM框架之MyBatis3(一)MyBatis入门

    MyBatis3介绍 mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的o ...

  4. Linux - sed 文本操作

    SED 是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大. sed全称是:Stream EDitor 调用sed命令有两种 ...

  5. 第10月第6天 lua 闭包

    1. static int mytest(lua_State *L) { //获取上值 )); printf("%d\n", upv); upv += ; lua_pushinte ...

  6. sublime text 3 开启卡顿(win7)解决办法

    启动sublime3,ctrl+~打开命令窗口,输入以下 { "update<em>check": false, "font</em>size&q ...

  7. java中final、finally、finalized使用方法

    首先需要明白  final和finally是关键字,finalize是一个方法. 1. final关键字 final可以修饰类.方法.变量, 修饰类表示类不可以被继承 修饰方法表示此方法不可以被重写( ...

  8. 存储之磁盘阵列RAID

         存储之磁盘阵列RAID RAID是由美国加州大学伯克利分校的D.A. Patterson教授在1988年提出的.RAID名为独立冗余磁盘阵列(RedundantArray of Indepe ...

  9. Regular Expression Matching & Wildcard Matching

    Regular Expression Matching Implement regular expression matching with support for '.' and '*'. '.' ...

  10. Mysql导入脚本失败,提示需要SUPER权限

    1.删除: /*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ 2.查看增删函数有没有重复 3.删除: set GLOBAL log ...