[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=2678

[算法]

首先不难想到如下DP :

记f[i]表示前i本书的高度和最小值

显然 , 有状态转移方程 : f[i] = min{ fj + max{hj+1 , hj+2 , ... hi} }

不难发现 , 当i确定时 , 随着j的减小 , max{hj + 1 , hj+2 , ... hi}的值单调递增

不妨维护一个单调递减的单调栈

预处理前缀和 , 每次在单调栈中二分出最靠左的左端点

然后 , 我们还需维护一棵支持单点修改 , 区间查询的线段树

每次在线段树中找到从合法左端点到当前点的最小值

详见代码 , 时间复杂度 : O(NlogN)

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
typedef long long LL;
const LL inf = 1e18; struct info
{
LL h , w;
} a[MAXN]; LL n , top;
LL L;
int s[MAXN];
LL cnt[MAXN] , dp[MAXN]; struct Segment_Tree
{
struct Node
{
int l , r;
LL mn;
} Tree[MAXN << ];
inline void build(int index , int l , int r)
{
Tree[index] = (Node){l , r , inf};
if (l == r) return;
int mid = (l + r) >> ;
build(index << , l , mid);
build(index << | , mid + , r);
}
inline void update(int index)
{
Tree[index].mn = min(Tree[index << ].mn , Tree[index << | ].mn);
}
inline void modify(int index , int pos , LL value)
{
if (Tree[index].l == Tree[index].r)
{
Tree[index].mn = value;
return;
}
int mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= pos) modify(index << , pos , value);
else modify(index << | , pos , value);
update(index);
}
inline LL query(int index , int l , int r)
{
if (l > r) return inf;
if (Tree[index].l == l && Tree[index].r == r) return Tree[index].mn;
int mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= r) return query(index << , l , r);
else if (mid + <= l) return query(index << | , l , r);
else return min(query(index << , l , mid) , query(index << | , mid + , r));
}
} SGT; template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
} int main()
{ read(n); read(L);
for (int i = ; i <= n; i++)
{
read(a[i].h);
read(a[i].w);
cnt[i] = cnt[i - ] + a[i].w;
}
SGT.build( , , n + );
s[top = ] = ;
dp[] = s[] = ;
SGT.modify( , , );
for (int i = ; i <= n; i++)
{
while (top > && a[i].h > a[s[top]].h) --top;
s[++top] = i;
SGT.modify( , top , dp[s[top - ]] + a[i].h);
int l = , r = top , pos = ;
while (l <= r)
{
int mid = (l + r) >> ;
if (cnt[i] - cnt[s[mid]] <= L)
{
pos = mid;
r = mid - ;
} else l = mid + ;
}
int loc = lower_bound(cnt , cnt + n + , cnt[i] - L) - cnt;
dp[i] = SGT.query( , pos + , top);
chkmin(dp[i] , dp[loc] + a[s[pos]].h);
}
cout<< dp[n] << '\n'; return ;
}

[USACO2012 OPEN] Bookshelf的更多相关文章

  1. [BZOJ2678][Usaco2012 Open]Bookshelf

    P.S. 偶然间发现可以用 markdown... [BZOJ2678][Usaco2012 Open]Bookshelf 试题描述 When Farmer John isn't milking co ...

  2. bzoj AC倒序

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

  3. bookshelf

    nodejs mysql ORM 比node-mysql好用多了. bookshelf 支持restful功能,用到的时候研究下:https://www.sitepoint.com/getting-s ...

  4. POJ3628 Bookshelf 2(01背包+dfs)

    Bookshelf 2 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8745   Accepted: 3974 Descr ...

  5. Bookshelf 2

    Bookshelf 2 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit  ...

  6. POJ 3628 Bookshelf 2(01背包)

    Bookshelf 2 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9488   Accepted: 4311 Descr ...

  7. 动态规划(状态压缩):BZOJ 2621 [Usaco2012 Mar]Cows in a Skyscraper

      2621: [Usaco2012 Mar]Cows in a Skyscraper Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 303  Sol ...

  8. BZOJ3016: [Usaco2012 Nov]Clumsy Cows

    3016: [Usaco2012 Nov]Clumsy Cows Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 52[Submi ...

  9. BZOJ 3011: [Usaco2012 Dec]Running Away From the Barn( dfs序 + 主席树 )

    子树操作, dfs序即可.然后计算<=L就直接在可持久化线段树上查询 -------------------------------------------------------------- ...

随机推荐

  1. Netty入门教程:Netty拆包粘包技术讲解

    Netty编解码技术是什么意思呢?所谓的编解码技术,说白了就是java序列化技术.序列化有两个目的: 1.进行网络传输2.对象持久化 虽然我们可以使用java进行序列化,Netty去传输.但是java ...

  2. Maven使用site-deploy(site:deploy)部署通过site生成的文档(Tomcat-WebDAV)

    Maven可以通过site生成项目的帮助文档,并且格式为html,那么可以通过site-deploy把文档部署到远端,部署方式支持HTTP/FTP/SCM/WebDAV等. 更多部署方案,参考:htt ...

  3. CentOS6.5升级手动安装GCC4.8.2 与 CentOS 6.4 编译安装 gcc 4.8.1

    http://blog.163.com/zhu329599788@126/blog/static/6669335020161179259975 http://www.cnblogs.com/codem ...

  4. 【Todo】Java8新特性学习

    参考这篇文章吧: http://blog.csdn.net/vchen_hao/article/details/53301073  还有一个系列

  5. 基于 orange(nginx+openresty) + docker 实现微服务 网关功能

    摘要 基于 orange(nginx+openresty) + docker 实现微服务 网关功能 ;以实现 docker 独立容器 来跑 独立语言独立环境 在 同一个授权下 运行相关组合程序..年初 ...

  6. 【LeetCode-面试算法经典-Java实现】【010-Regular Expresssion Matching(正則表達式匹配)】

    [010-Regular Expresssion Matching(正則表達式匹配)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Implement regular ...

  7. max-points-on-a-line——穷举

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...

  8. opencms 安装出现以下的问题:Your &#39;max_allowed_packet&#39; variable is set to less than 16777216 Byte (16MB).

    一.问题 在安装opencms是会出现例如以下错误: MySQL system variable 'max_allowed_packet' is set to 1048576 Byte (1MB). ...

  9. Unicode解码转换为中文

    Unicode转中文2:Regex.Unescape(string str);str格式:"\uxxxx" ,举例:"\u300d"

  10. SQL server 数据库

    SQL server 的开启关闭和暂停 数据库表格