传送门

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

容易想到贪心,每一层都贪心地选最小的宽度,然后发现 $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. 四轴飞行器飞行原理与双闭环PID控制

    四轴轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的 ...

  2. nginx的RPM包制作案例

    使用nginx-1.12.2版本的源码软件,生成对应的RPM包软件,具体如下: - 软件名称为nginx - 软件版本为1.12.2 - RPM软件包可以查询描述信息 - RPM软件包可以安装及卸载 ...

  3. hInstWtsapi32 = LoadLibrary("Wtsapi32.dll");

    https://www.cnblogs.com/beawesome/p/6473668.html 进程枚举 之类

  4. alert(1) to win 2

    function escape(s) { s = s.replace(/"/g, '\\"'); return '<script>console.log("' ...

  5. AOP技术介绍--(引言)

    软件设计因为引入面向对象思想而逐渐变得丰富起来.“一切皆为对象”的精义,使得程序世界所要处理的逻辑简化,开发者可以用一组对象以及这些对象之间的关系将软件系统形象地表示出来.而从对象的定义,进而到模块, ...

  6. Oracle12c修改时区

    Oacle12c支持可插入数据库(PDB)在一个统一的数据库(CDB)中具有不同的字符集.时区文件版本和数据库时区. 出于性能原因,Oracle建议将数据库时区设置为UTC(0:00),因为不需要转换 ...

  7. python学习笔记(十八)python操作excel

    python操作excel需要安装通过pip安装xlwt, xlrd这两个模块: pip install xlwt pip insall xlrd 操作excel ,写入excel: import x ...

  8. Telegraf根据配置文件启动(Influxdb的数据收集)

    1.创建一个telegraf.config文件 telegraf -sample-config -input-filter cpu:disk:diskio:net:system:mem -output ...

  9. Object and Collection Initializers (C# Programming Guide) 类初始化

    public class Cat { // Auto-implemented properties. public int Age { get; set; } public string Name { ...

  10. CSS入门基础学习一

    一.CSS样式 1.什么是CSS: CSS是指层叠样式表(Cascading Style Sheels),CSS通常为CSS样式表或层叠样式表,主要用于设置HTML文本内容,以及版本面的布局等 2.H ...