ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP)

2021-12-08 09:00:36  阅读:179  来源: 互联网

标签:本书 ch 书架 2021.12 int USACO12OPEN 08 pos include


2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP)

https://www.luogu.com.cn/problem/P1848

题意:

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

每本书 i 都有宽度 W(i) 和高度 H(i)。书需要按顺序添加到一组书架上;比如说,第一层架子应该包含书籍1 ... k,第二层架子应该以第k + 1本书开始,以下如此。每层架子的总宽度最大为L(1≤L≤1,000,000,000)。每层的高度等于该层上最高的书的高度,并且整个书架的高度是所有层的高度的总和,因为它们都垂直堆叠。

请帮助农夫约翰计算整个书架的最小可能高度。

有N(1 <= N <= 100000)本书,每本书有一个宽度W(i),高度H(i),(1 <= H(i) <= 1,000,000; 1 <= W(i) <= L)。

现在有足够多的书架,书架宽度最多是L (1 <= L <= 1,000,000,000),把书按顺序(先放1,再放2.....)放入书架。某个书架的高度是该书架中所放的最高的书的高度。

将所有书放入书架后,求所有书架的高度和的最小值?

分析:

对于前 \(i\) 本书放在书架上需要的高度为 \(f_i\) 。

设 \(sum_i\) 为前 \(i\) 本书宽度 \(w_j(j\in j<=i)\) 之和,则

\[f_i=\min(f_{j-1}+\max(f_{j},f_{j+1},\cdots,f_i))\\ j\in sum_i-sum_{j-1}<=L \]

对于第 \(i\) 本书,存在 \(pos_i\) 使得 \(pos_i\) 是 \(i\) 最左侧的一本书满足 \(h_{pos_i}>=h_i\) 。对于第 \(pos_i+1\) 本书到到第 \(i\) 本书之间最大值为 \(h_i\) 。

建一棵线段树,可区间修改(修改 \(pos_i+1\) 到 \(i\) 的值为 \(h_i\) )、区间查询(查询 \(j\) 到 \(i\) 之间 \(f_{j-1}+\max(f_{j},f_{j+1},\cdots,f_i)\) 最小值)、单点修改(对于每个点要初始化)。

初始化的时候对于每个点 \(i\) ,因为必须要满足 \(i\) 前所有点依旧满足条件,所以每个叶子结点的含义就是以 \(i\) 为分界点,\(f_{i-1}+\max(f_i,f_{i+1},\cdots,f_{要查询的点})\) ,而且每次更新的区间的值为 \(h_i\) ,这个值会不断覆盖以前更新过的值,但是保证最优因为被更新的区间的值都比 \(h_i\) 小,且不存在 \(j\) 满足 \(h_j>h_i\) 且 \(pos_i+1<=j<=i\) 。

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;

#define int long long
typedef long long ll;
const ll inf=1e18;
const int N=1e5+10;
int n,L,h[N],w[N],pos[N],sum[N];
ll f[N],lazy[N<<2],val[N<<2],tot[N<<2];
stack<int>s;

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	} 
	return s*w;
}
inline void update(int x){
	tot[x]=min(tot[x<<1],tot[x<<1|1]);
	val[x]=min(val[x<<1],val[x<<1|1]);
}
inline void pushdown(int x){
	if(lazy[x]==inf)return ;
	tot[x<<1]=val[x<<1]+lazy[x];
	tot[x<<1|1]=val[x<<1|1]+lazy[x];
	lazy[x<<1]=lazy[x<<1|1]=lazy[x];
	lazy[x]=inf;
}
inline void build(int x,int l,int r){
	tot[x]=val[x]=lazy[x]=inf;
	if(l==r)return ;
	int mid=(l+r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
}
inline void changeline(int x,int l,int r,int L,int R,int k){
	if(l>R||r<L)return ;
	if(l>=L&&r<=R)return (void)(tot[x]=val[x]+k,lazy[x]=k);
	pushdown(x);
	int mid=(l+r)>>1;
	if(mid>=L)changeline(x<<1,l,mid,L,R,k);
	if(R>mid)changeline(x<<1|1,mid+1,r,L,R,k);
	update(x);
}
inline void changespot(int x,int l,int r,int k){
	if(l==r)return (void)(tot[x]=inf,val[x]=f[l-1]);
	pushdown(x);
	int mid=(l+r)>>1;
	if(k<=mid)changespot(x<<1,l,mid,k);
	if(k>mid)changespot(x<<1|1,mid+1,r,k);
	update(x);
}
inline ll query(int x,int l,int r,int L,int R){
	if(l>R||r<L)return inf;
	if(l>=L&&r<=R)return tot[x];
	pushdown(x);
	int mid=(l+r)>>1;
	ll ans=inf;
	if(L<=mid)ans=min(ans,query(x<<1,l,mid,L,R));
	if(R>mid)ans=min(ans,query(x<<1|1,mid+1,r,L,R));
	return ans;
}

signed main(){
	n=read();L=read();
	for(int i=1;i<=n;i++)h[i]=read(),w[i]=read(),sum[i]=sum[i-1]+w[i];
	s.push(1);
	for(int i=2;i<=n;i++){
		while(!s.empty()&&h[i]>h[s.top()])s.pop();
		if(!s.empty())pos[i]=s.top();
		s.push(i);
	}
	build(1,1,n);
	for(int i=1;i<=n;i++){
		changespot(1,1,n,i);
		if(pos[i]<i)changeline(1,1,n,pos[i]+1,i,h[i]);
		int Li=lower_bound(sum,sum+i+1,sum[i]-L)-sum;
		int Ri=i;
		if(Li<Ri)f[i]=query(1,1,n,Li+1,Ri);
	}
	cout<<f[n];
	return 0;
}

标签:本书,ch,书架,2021.12,int,USACO12OPEN,08,pos,include
来源: https://www.cnblogs.com/eleveni/p/15659820.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有