[题目链接]

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. T3139 栈练习3 codevs

    http://codevs.cn/problem/3139/ 题目描述 Description 比起第一题,本题加了另外一个操作,访问栈顶元素(编号3,保证访问栈顶元素时或出栈时栈不为空),现在给出这 ...

  2. Codeforces Gym 100418K Cards 组合数学

    CardsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action? ...

  3. 转 vs2010转vs2008 其他的一样

    如果你使用VS2010的任何版本写代码,那么在VS2008中就不能打开VS2010的解决方案了,为此,通过以下三步就可以解决了一.对于工程名.sln; 1.用你喜欢的编辑器打开sln文件,比如note ...

  4. 内核调试 SystemTap

    http://www.cnblogs.com/wangkangluo1/archive/2012/06/26/2562971.html   相关技术:utrace, probe, ftrace, dt ...

  5. 查询公司外网ip方法

    curl -s "http://checkip.dyndns.org/"|cut -f 6 -d" "|cut -f 1 -d"<" ...

  6. ftp服务器调用出错

    因工作需要,需从FTP服务器上下载文件,本地测试OK,服务器上在FTP服务器连接之后卡住,没有异常和提示信息,在打印FTP命令之后,显示:150 Opening data channel for fi ...

  7. Android 最新控件 Toolbar

    之前Android的ActionBar好像做项目从没用过.除了google自己,并没有多少人用,究其原因,主要是由于ActionBar不够灵活,不可以随心所欲的定制,后来Goole也发现了这一点,然后 ...

  8. Maven实现Web应用集成測试自己主动化 -- 測试自己主动化(WebTest Maven Plugin)

    近期在appfuse看到使用webtest-maven-plugin实现Web应用的集成測试,研究了下.感觉很不错.对于Web应用自己主动构建很有帮助,在性能測试之前能够保证Web应用的基本功能工作正 ...

  9. PHP读取excel(5)

    如果数据量很大的时候,就需要用PHPExcel迭代器逐行读取,具体代码如下: <?php header("Content-Type:text/html;charset=utf-8&qu ...

  10. Linux input子系统实例分析(二)

    紧接着上一节的实例我们来分析调用的input子系统的接口: 1. input_dev,用来标识输入设备 1: struct input_dev { 2: const char *name; //设备名 ...