传送门

感觉正着做不太好搞,考虑倒过来搞

容易想到贪心,每一层都贪心地选最小的宽度,然后发现 $WA$ 了...

因为一开始多选一点有时可以让下一层宽度更小

然后有一个神奇的结论,最高的方案一定有一种是底层最窄的方案

证明:

考虑把所有块按顺序排成一排并分成几段,每一段都表示一层,假设如图是一种底层最窄的方案

假设有一种更优的方案,使得底层更宽:

那么根据抽屉原理,蓝色至少一段中间一定有两个的红色分割线

不妨找到这样一个位置,标记为 $x,y$ :

那么我们显然可以构造一个新的方案,使得上面几层按 $y$ 之后红色的分割,下面几层按 $p$ 之前蓝色的分割,中间一层是 $[p,y]$

因为 $[p,y]$ 比 $[x,y]$ 大,所以更上层也一定小于 $[p,y]$,同理 $[p,y]$ 一定小于 $[p,q]$ ,所以下层一定大于 $[p,y]$

然后发现我们构造的新方案变成了层数更多,底层仍然最窄的方案

所以证明了底层最窄的方案一定有一种是最优方案

然后就可以 $dp$ 了,设 $f[i]$ 表示考虑完 $i,n$ 的块时,底层最窄的宽度,同时维护 $g[i]$ 表示考虑完 $i,n$ 的块,底层最窄时的最大层数

那么显然枚举所有 $j>i$ ,转移 $f[i]=min(sum[j-1]-sum[i])$($sum$ 是块宽度的前缀和)并且满足 $sum[j-1]-sum[i]>=f[j]$

然后发现对于两个决策 $k,j$ 其中 $k>j$,$k$ 会比 $j$ 更优仅当 $j$ 此时不合法,即 $sum[j-1]-sum[i]<f[j]$

又因为 $sum[i]$ 单调不增,所以合法决策点只会越来越小,所以用一个单调队列维护一波就可以做到 $O(n)$ 的转移了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
typedef long long ll;
using namespace std;
inline ll read()
{
ll x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+;
int n,a[N],ans,g[N],Q[N];
ll sum[N],f[N];
// f[i]=sum[j-1]-sum[i-1] j>i sum[j-1]-sum[i-1]>=f[j]
// sum[i-1]<=sum[j-1]-f[j]
// k>j sum[k-1]-f[k]>sum[j-1]-f[j]
int main()
{
n=read();
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=n;i++) sum[i]=sum[i-]+a[i];
int L=,R=; Q[]=n+;
for(int i=n;i;i--)
{
while(L<R&&sum[Q[L+]-]-sum[i-]>=f[Q[L+]]) L++;//队列中越后面的位置越优
f[i]=sum[Q[L]-]-sum[i-]; g[i]=g[Q[L]]+;
while(L<=R&&sum[Q[R]-]-f[Q[R]]<=sum[i-]-f[i]) R--;
Q[++R]=i;
}
printf("%d\n",g[]);
return ;
}

1233: [Usaco2009Open]干草堆tower的更多相关文章

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

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

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

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

  3. ●BZOJ 1233 [Usaco2009Open] 干草堆 tower

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1233 留坑.以后再来看看. (绝望,无奈,丧心...) (这个题的证明真的很诡异啊,看得我稀 ...

  4. bzoj 1233: [Usaco2009Open]干草堆tower【dp+单调栈】

    参考:https://www.cnblogs.com/N-C-Derek/archive/2012/07/11/usaco_09_open_tower.html 虽然长得很像斜率优化,但是应该不算-- ...

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

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

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

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

  7. bzoj1233: [Usaco2009Open]干草堆tower

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

  8. bzoj1233 [Usaco2009Open]干草堆tower 【单调队列dp】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1233 单调队列优化的第一题,搞了好久啊,跟一开始入手斜率优化时感觉差不多... 这一题想通了 ...

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

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

随机推荐

  1. javaweb各种框架组合案例(九):springboot+tk.mybatis+通用service

    一.项目结构 二.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  2. VPS 安装MySQL

    目前Centos下默认支持的数据库是MariaDB,MariaDB是mysql的增强版本,由于mysql被Oracle收购之后,mysql之父担心之后mysql会变成闭源的软件,就又开发了这个版本,支 ...

  3. 使用GDB调试产生多进程的程序

    如果一个进程fork了多个进程,这时使用GBD工具对程序进行调试会如何呢? 实际上,GDB 没有对多进程程序调试提供直接支持.例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试 ...

  4. Altium Designer 19 导出光绘文件

    一.点击 文件--制造输出--Gerber Files 第一次设置如下 绘制层点击进去全选 钻孔光圈 符号大小50mil 生成文件 关闭不用保存 蚀刻图 二.点击 文件--制造输出--Gerber F ...

  5. html5 新增和改良的input 类型实例

    url test1.html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  6. 如何用node开发自己的cli工具

    如何用node开发自己的cli工具 灵感 写这个工具的灵感以及场景源于youtube的一次闲聊 github 地址 blog首发 使用场景 原本我们写博客展示shell,例如:安装运转docker,一 ...

  7. vue中select的使用以及select设置默认选中

    简介 今天写pc端引入vue,遇到了一个问题,就是我循环出select内的数据以后,发现原本默认显示第一条的select框变成了空白,要选择后才有显示,结果查了好多文档,讲的都不是很清楚,后来看到一句 ...

  8. Android 播放器开发

    GSY https://github.com/CarGuo/GSYVideoPlayer/blob/master/doc/USE.md 阿里云播放器 https://helpcdn.aliyun.co ...

  9. 实现bind函数

    面试中碰到的bind函数,今天来研究下 //1.bind的返回值是函数 var obj={ name:"zhouy" } function f() { console.log(th ...

  10. SQL Server查询使用键查找时锁申请及释放顺序

    当然看的过程中,其实自己有个疑问: 对于键查找这类查询,会申请哪些锁,锁申请和释放的顺序是怎样的? 准备 备注:测试表仍然使用高兄文中创建的测试表testklup 在开始之前,使用dbcc ind 命 ...