传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1233

单调队列优化的第一题,搞了好久啊,跟一开始入手斜率优化时感觉差不多。。。

这一题想通了之后其实不是很难,主要是需要拐弯的地方有点点多,直接写正解叭~

首先,这一题要求的是最大叠多少层。可以这样想:最底层的长度越小,层数越高。尽管这不是很严格,不过还算是比较显然(但是根本就没往这上面想啊!),因为越窄,就会越高嘛。换句话说“最大能叠多少层”等价于“最底层长度最小为多少”!只要这个想通了,基本就差不多了。

倒着dp,f[i]为从第i到第n的干草堆都使用了,最底层的长度的最小值。s[i]是前缀和。那么dp方程是:

f[i] = min(s[j - 1] - s[i - 1]) (f[j] <= s[j - 1] - s[i - 1])

附加条件移项得,s[i - 1] <= s[j - 1] - f[j],也就是说,s[j - 1] - f[j]越大,就越有可能作为决策。

裸的是O(N^2)。发现当j越小,s[j - 1] - s[i - 1]就会越小,所以应该取符合"s[i - 1] <= s[j - 1] - f[j]"这一条件的最小的j,这就用单调队列维护咯。当j < k时,若s[j - 1] - f[j] >= s[k - 1] - f[k],则k一定不能作为决策,因为k比j大,对于“当j越小,s[j - 1] - s[i - 1]就会越小”这个条件已经不利了,它的s[k - 1] - f[k]还要更小,更不利了,果断舍弃。

答案要的是最多叠几层,用个g数组,g[i]表示从第i到第n的干草堆都使用了,最多叠几层。则g[i] = g[j] + 1,j就是对于f[i] = min(s[j - 1] - s[i - 1])的决策的那个j

#include <cstdio>

const int maxn = ;

int n, s[maxn], f[maxn], g[maxn], que[maxn], head, tail;

int main(void) {
scanf("%d", &n);
for (int i = ; i <= n; ++i) {
scanf("%d", s + i);
s[i] += s[i - ];
} que[tail++] = n + ;
for (int i = n; i; --i) {
while (head < tail - && s[i - ] <= s[que[head + ] - ] - f[que[head + ]]) {
++head;
}
f[i] = s[que[head] - ] - s[i - ];
g[i] = g[que[head]] + ;
while (head < tail && s[i - ] - f[i] >= s[que[tail - ] - ] - f[que[tail - ]]) {
--tail;
}
que[tail++] = i;
}
printf("%d\n", g[]);
return ;
}

bzoj1233 [Usaco2009Open]干草堆tower 【单调队列dp】的更多相关文章

  1. bzoj1233[Usaco2009Open]干草堆tower 单调队列优化dp

    1233: [Usaco2009Open]干草堆tower Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 983  Solved: 464[Submi ...

  2. BZOJ1233 [Usaco2009Open]干草堆tower 【单调队列优化dp】

    题目链接 BZOJ1233 题解 有一个贪心策略:同样的干草集合,底长小的一定不比底长大的矮 设\(f[i]\)表示\(i...N\)形成的干草堆的最小底长,同时用\(g[i]\)记录此时的高度 那么 ...

  3. BZOJ1233 [Usaco2009Open]干草堆tower[贪心+单调队列优化]

    地址 注意思路!多看几遍! 很巧妙的一道题.不再是决策点以dp值中一部分含j项为维护对象,而是通过维护条件来获取决策. 首先有个贪心策略,让底层的宽度尽可能小,才能让高度尽可能高.所以应该倒着dp,表 ...

  4. bzoj1233: [Usaco2009Open]干草堆tower

    Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的干草(1<=N<=100000)(从1到N编号) ...

  5. BZOJ1233 [Usaco2009Open]干草堆tower 和 BZOJ3549 [ONTAK2010]Tower

    题意 Problem 3549. -- [ONTAK2010]Tower 3549: [ONTAK2010]Tower Time Limit: 10 Sec  Memory Limit: 64 MBS ...

  6. 【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)

    1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...

  7. bzoj 1233: [Usaco2009Open]干草堆tower

    1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...

  8. bzoj 1233: [Usaco2009Open]干草堆tower 【想法题】

    首先这题的$n^3$的DP是比较好想的 $f[i][j]$表示用前$i$包干草 且最顶层为第$j+1$包到第$i$包 所能达到的最大高度 然而数据范围还是太大了 因此我们需要去想一想有没有什么单调性 ...

  9. 1233: [Usaco2009Open]干草堆tower

    传送门 感觉正着做不太好搞,考虑倒过来搞 容易想到贪心,每一层都贪心地选最小的宽度,然后发现 $WA$ 了... 因为一开始多选一点有时可以让下一层宽度更小 然后有一个神奇的结论,最高的方案一定有一种 ...

随机推荐

  1. django 简易博客开发 3 静态文件、from 应用与自定义

    首先还是贴一下源代码地址  https://github.com/goodspeedcheng/sblog 上一篇博客我们介绍了 django 如何在views中使用templates以及一些常用的数 ...

  2. 【c++】面向对象程序设计之访问控制与继承

    受保护的成员(protected): 1.和私有成员类似,受保护的成员对于类的用户来说是不可访问的 2.和共有成员类似,受保护的成员对于派生类的成员和友元来说是可访问的 3.派生类的友元只能通过派生类 ...

  3. 使用mongostat监视mongodb

    1, 监视一个mongod mongostat 10.80.1.1:27018 1,监视replica set mongostat --host rs0/10.80.1.1:27018,10.80.1 ...

  4. 笔记本 ThinkPad E40 安装 Mac OS X 10.9.3 Mavericks 系统

    关于:自己最早接触Mac OS X系统是在一个论坛里.记得好像是2011年:那时论坛里就有人在虚拟机上执行Mac OS X 10.7系统.当时也依照论坛里的方法在虚拟机上成功装上了系统.那时開始就被苹 ...

  5. Android NDK编程浅入深出之--Android.mk

        Android.mk Android.mk是一个向Android NDK构建系统描写叙述NDK项目的GUN Makefile片段.它是每个NDK项目的必备组件. 构建系统希望它出如今jni子文 ...

  6. ffmpeg转码本地文件(一)

    ffmpeg转码本地文件(一) 实现目标:输入本地文件.实现本地文件转码,里面包括mux层转码,codec层转码,视频格式转换,音频重採样等功能,功能点请看凝视.注意:凝视非常重要. #ifndef ...

  7. 远程调试 Asp.Net 项目

    项目部署到产品环境后,难免会发生一些故障,有一些可以在本地测试环境中直接重现,而有一些则无法重现.对于可以在本地测试环境中重现的Bug,开发人员往往能够很迅速地进行问题排查.而对于无法重现的Bug,就 ...

  8. flask的路由配置,特殊装饰器

    1,flask中的路由 endpoint-url_for反向地址 endpoint默认是视图函数名endpoint="雪雪" methods 指定视图函数的请求方式,默认GET d ...

  9. 单点登录原理及实现sso

    WEB的登录那些事 说道账户登录和注册,其实我们每天都在亲身感受着,像微博.知乎还有简书等等.我们总是需要定期的去重新登录一下,对于这种认证机制,我们都能说出来两个名词,Cookie.Session. ...

  10. HDU - 1150 Machine Schedule(最小点覆盖数)

    1.有两台机器A和B以及N个需要运行的任务.A机器有n种不同的模式,B机器有m种不同的模式,而每个任务都恰好在一台机器上运行.如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则 ...