传送门

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

容易想到贪心,每一层都贪心地选最小的宽度,然后发现 $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. Rsync+inotify 数据同步应用指南

    Rsync+Inotify-tools (1):Inotify-tools 只能记录下被监听的目录发生了变化(包括增加.删除.修改),并没有 把具体是哪个文件或者哪个目录发生了变化记录下来: (2): ...

  2. 237-基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡

    基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡 一. 板卡概述  本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片, ...

  3. Taro -- 微信小程序登录

    Taro微信小程序登录 1.调用Taro.login()获取登录凭证code: 2.调用Taro.request()将code传到服务器: 3.服务器端调用微信登录校验接口(appid+appsecr ...

  4. 在MySQL登录时出现Access denied for user 'root'@'localhost' (using password: YES) 拒绝访问,并可修改MySQL密码

    这两天装了一个mysql 5.7数据库,但是在本地dos登陆不上去,报错Access denied for user 'root'@'localhost'(using password:YES): 也 ...

  5. django 使用ORM插入数据,提示Cannot assign "1": "B" must be a "Projectconfig" instance.

    这是因为使用了外键导致的, 如果使用了外键,先实例化外键查询,然后再插入的表里面放入实例化后的外键连接

  6. sklearn.metrics.mean_absolute_error

    注意多维数组 MAE 的计算方法 * >>> from sklearn.metrics import mean_absolute_error >>> y_true ...

  7. 做网站用php还是python

    单纯说做网站,显然是php更适合,php是专为web而生,而Python只是可以做web.php也比python更简单,更容易学,对于新手更友好. 从权威技术网站w3techs.com2017年7月2 ...

  8. 使用tinymce编辑器从word保持原格式复制粘贴的办法

    官网地址http://ueditor.baidu.com Git 地址 https://github.com/fex-team/ueditor 参考博客地址 http://blog.ncmem.com ...

  9. Android中对Apk加固(加壳)续篇之---对Native层(so文件)进行加固

    有人说Android程序用Java代码写的,再怎么弄都是不安全的,很容易破解的,现在晚上关于应用加固的技术也很多了,当然这些也可以用于商业发展的,梆梆加密和爱加密就是很好的例子,当然这两家加固的Apk ...

  10. 【Java】Java URLDecoder异常Illegal hex characters in escape (%)

    如果收到的HTTP请求参数(URL中的GET请求)中有一个字符串,是中文,比如“10%是黄段子”,服务器段使用URLDecoder.decode就会出现此异常.URL只能使用英文字母.阿拉伯数字和某些 ...