BZOJ4268 : 小强的书架
首先将所有高度乘上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 : 小强的书架的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [BZOJ1861][Zjoi2006]Book 书架
[BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...
- Android分享一款漂亮的折叠书架菜单
一个Android折叠书架菜单,效果极佳,给人的视觉感觉很好,便于使用. FoldingMenu
- [转载]我的Java后端书架 (2016年暖冬4.0版)
[转载]我的Java后端书架 (2016年暖冬4.0版) ps:最近正在初学Java,有一些其他语言的底子,但是还是要好好看书,好好练习,网上找了好久,都没有这份书单来的实用,特意转载过来,方便以 ...
- BZOJ 1861: [Zjoi2006]Book 书架
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1290 Solved: 740[Submit][Stat ...
- 基于HT的CSG功能构建HTML5的3D书架
构造实体几何CSG全称Constructive solid geometry,是3D计算机图形学中构建模型的常用技术,可通过合并Union.相减Subtraction和相交Intersction的三种 ...
- 【代码笔记】iOS-点击加号增加书架,点击减号减少书架
一,效果图. 二,工程图. 三,代码. ReaderViewController.h #import <UIKit/UIKit.h> @interface ReaderViewContro ...
- 【BZOJ-1926】粟粟的书架 二分 + 前缀和 + 主席树
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MBSubmit: 616 Solved: 238[Submit][Statu ...
- BZOJ 1861: [Zjoi2006]Book 书架 splay
1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ...
随机推荐
- HDU 2509 基础Anti-SG NIM
如果我们规定当局面中所有的单一游戏的SG值为0时,游戏结束,则先手必胜当且仅当:(1)游戏的SG!=0 && 存在单一游戏的SG>1:(2)游戏的SG==0 && ...
- SpringMvc数据校验@Valid等注解的使用与工具类抽取
最近在重构老项目的代码,发现校验入参占用了很多代码,之前我对这一块的认识局限于使用StringUtils等工具来多个if块进行判断,代码是没什么问题,但是总写这些令人生烦,毕竟写代码也要讲究优雅的嘛, ...
- 关于 xcode5 的no matching provisioning profiles found
CHENYILONG Blog 关于 xcode5 的no matching provisioning prof- about the question in xcode5 "no matc ...
- 第10月第5天 v8
1. brew install v8 http://www.cnblogs.com/tinyjian/archive/2017/01/17/6294352.html http://blog.csdn. ...
- deeplearning.ai学习seq2seq模型
一.seq2seq架构图 seq2seq模型左边绿色的部分我们称之为encoder,左边的循环输入最终生成一个固定向量作为右侧的输入,右边紫色的部分我们称之为decoder.单看右侧这个结构跟我们之前 ...
- mongodb导入json文件
mongoimport --db test --collection item --jsonArray item.json
- 『Matplotlib』数据可视化专项
一.相关知识 官网介绍 matplotlib API 相关博客 matplotlib绘图基础 漂亮插图demo 使用seaborn绘制漂亮的热度图 fig, ax = plt.subplots(2,2 ...
- phantomhs获取网页的高度
function heheda() { window.setTimeout(function () { console.log("---------------------Capture O ...
- shell脚本 ------ 输出带颜色的字体
shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 格式如下: echo -e “\033[字背景颜色:文字颜色m字符串\033[0m” 例如: echo -e “\03 ...
- ruby on rails在fedora18上install
ruby on rails 在fedora18下的安装 天朝的网络原因,安装不是很顺畅,所以把过程记录下备用 前面下载rubygem什么的都比较快,新建一个project的时候会出问题 gem new ...