[USACO2012 OPEN] Bookshelf
[题目链接]
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的更多相关文章
- [BZOJ2678][Usaco2012 Open]Bookshelf
P.S. 偶然间发现可以用 markdown... [BZOJ2678][Usaco2012 Open]Bookshelf 试题描述 When Farmer John isn't milking co ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bookshelf
nodejs mysql ORM 比node-mysql好用多了. bookshelf 支持restful功能,用到的时候研究下:https://www.sitepoint.com/getting-s ...
- POJ3628 Bookshelf 2(01背包+dfs)
Bookshelf 2 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8745 Accepted: 3974 Descr ...
- Bookshelf 2
Bookshelf 2 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- POJ 3628 Bookshelf 2(01背包)
Bookshelf 2 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9488 Accepted: 4311 Descr ...
- 动态规划(状态压缩):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 ...
- BZOJ3016: [Usaco2012 Nov]Clumsy Cows
3016: [Usaco2012 Nov]Clumsy Cows Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 71 Solved: 52[Submi ...
- BZOJ 3011: [Usaco2012 Dec]Running Away From the Barn( dfs序 + 主席树 )
子树操作, dfs序即可.然后计算<=L就直接在可持久化线段树上查询 -------------------------------------------------------------- ...
随机推荐
- js-判断当前页面是否在微信浏览器中打开
方案一:推荐 var ua = navigator.userAgent.toLowerCase(); var isWinxin = ua.indexOf('micromessenger') != -1 ...
- (6)DataTable 转换成 Json
下载 Json.Net DLL http://www.newtonsoft.com/json 需要FQ using Newtonsoft.Json; public string Da ...
- luogu P1080 国王游戏
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...
- [Bzoj3676][Apio2014]回文串(后缀自动机)(parent树)(倍增)
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 3396 Solved: 1568[Submit][Statu ...
- 深究Spring中Bean的生命周期
前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上 ...
- Spark学习(四)Spark2.3 HA集群的分布式安装
一.下载Spark安装包 1.从官网下载 http://spark.apache.org/downloads.html 2.从微软的镜像站下载 http://mirrors.hust.edu.cn/a ...
- Maven错误 diamond operator is not supported in -source 1.5 (use -source 7 or higher to enable diamond operator)问题解决
如果在Maven构建时出现: diamond operator is not supported in -source 1.5 (use -source 7 or higher to enable d ...
- spring工具类获取bean
import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebAppl ...
- c++中c_str()函数
https://zhidao.baidu.com/question/104592558.html
- elasticsearch学习网站
elasticsearch学习网站 https://elasticsearch.cn/