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在看书 ...
随机推荐
- SQL记录-PLSQL过程
PL/SQL过程 子程序是一个程序单元/模块执行特定的任务.这些子程序被组合以形成更大的程序.这基本上是被称为“模块化设计”.子程序可以调用由另一个子程序或程序被称为调用程序. 子程序可以创建: ...
- 接口测试Case之面向页面对象编写规范
一.什么是页面对象化 主要提倡的思想是:万物皆对象,即把一个Page看成一个对象,来进行接口自动化Case的编写,不要闲扯,直接讲怎么个操作法呢? 二.有什么优势? 2.1 Case层次清晰,便于管理 ...
- Java SSM框架之MyBatis3(一)MyBatis入门
MyBatis3介绍 mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的o ...
- javascript类式继承函数最优版
直接上代码: klass函数 var klass = function (Parent, props) { var Child, F, i; //1.新构造函数 Child = function () ...
- Jad查看源码
需要者两个文件:下载地址:http://pan.baidu.com/s/11qq4I 1,解压jar包 有两个文件 分别是net.sf.jadclipse_3.3.0 jad.exe 文件 2,找到m ...
- 如何解决Mac只能登QQ不能联网
如何解决Mac只能登QQ不能联网,路由正常,Wifi帐号密码正确,但wifi中断不能联网的问题.
- mysql 1045 access denied for user 解决方法
提示:1045 access denied for user 'root'@'localhost' using password yes方法一: # /etc/init.d/mysql stop # ...
- __new__[转载]
转载自https://www.cnblogs.com/MnCu8261/p/6365665.html 实际上,实例化类时调用的第一个方法并不是__init__,而是__new__,其作用正是创建并返回 ...
- Servlet笔记9--Cookie
Cookie: 使用Cookie机制实现十天内免登陆: Servlet程序: package com.bjpowernode.javaweb.servlet; import java.io.IOExc ...
- 003_cd pushd popd三个命令的区别
一. It depends. In zsh you can configure cd to push the old directory on the directory stack automati ...