[题目链接]

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. Debian9初始配置

    1 进入root用户 su root 2 修改镜像源:编辑/etc/apt/sources.list文件 nano /etc/apt/sources.list 修改内容如下: deb http://m ...

  2. 洛谷—— P3375 【模板】KMP字符串匹配

    P3375 [模板]KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. (如 ...

  3. 前端微服务-面向web平台级应用的设计

    从去年开始,前端领域就出现了一个‘微应用’的名词,说的是前端架构的一种设计思路,业内都把它和后端的微服务进行类比,当时忙于公司的项目.没有静下心来好好了解,现在项目结束,再加上最近看的几篇关于前端微服 ...

  4. 如何使用NSOperations和NSOperationQueues 第一部分

    这篇文章还可以在这里找到 英语 学习如何在你的app中使用NSOperations! 这篇博客是由iOS个人开发者Soheil Moayedi Azarpour发布的. 每个人都会在使用iOS或者Ma ...

  5. RMA Sales Order – Stuck with “Awaiting Return Disposition”

    RMA Sales Order – Stuck with “Awaiting Return Disposition” Action : (Prod) ð  Login to Unix ð  su – ...

  6. 【Discuz】ucenter通讯失败与Discuz的头像无法显示

    假设是Discuz论坛的一些小样式图片.仅仅须要升级一下Discuz论坛的论坛或者,直接把整个网站的css的首域名替换一下.比方将127.0.0.1:8080/..开头的东西全改成127.0.0.1: ...

  7. 【剑指offer】异或去重

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27568975 这篇文章没有代码.介绍的是纯理论的思路. 异或是一种基于二进制的位运算,用符 ...

  8. bootstrap之ScrollTo

    ScrollTo package io.appium.android.bootstrap.handler; import com.android.uiautomator.core.UiObject; ...

  9. Android studio 百度地图开发(2)地图定位

    Android studio 百度地图开发(2)地图定位 email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是Android S ...

  10. hive cli 启动缓慢问题

    hive-0.13.1启动缓慢的原因 发现时间主要消耗在以下3个地方: 1. hadoopjar的时候要把相关的jar包上传到hdfs中(这里大概消耗5s,hive0.11一样,这个地方不太好优化) ...