这里已经讲得很清楚了。

方程$f_i=\min\{f_j+\max_{j+1\sim i}\}$。

本质上是决策点与区间最大值有一定关系,於是用单调队列来维护决策集合(而不是常规的),然后在决策集合中选取最小值。

然后觉得这题方法还是很重要的。没写平衡树,用优先队列(堆)来维护,单调队列维护最大值删除元素时用vis标记一下,取优先队列首的时候判断有没有被标记过,是的话就扔掉重复此动作。

然后最左端是特例,特殊对待就行了。具体还看上面↑。

2019.11.05 UPD:

什么嘛,DP优化学傻掉了,这个平衡树的优化根本不优秀好吗,如果$f$改成不单调的,然后有$\max,\min$两个一起出现,不就全部木大了吗。

观察一下,实际上单调队列(或者实际是栈)里面每一个元素表示这个数控制了这一段区间的最值($q[i-1]+1\sim q[i]$)。那我显然可以直接把$f_j$塞到线段树的$j$里(基于序列的),然后控制区间最值的数对这段数区间加,然后插入新元素的时候单调栈弹栈,把栈顶这个元素控制的这个区间统一减去这个最值,最后统一使用新的元素,也就是区间加,同时在线段树里维护min就行了。


错误:很智障的把m数据类型定义为int。。结果查半天才发现是类型不对。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=+;const ll INF=1e13;
struct komeiji_satori{
int las,now;
komeiji_satori(int x=,int y=):las(x),now(y){}
};
ll a[N],sum[N],f[N],m;//m!!!!long long !!!
int q[N],vis[N];
int n,L,l=,r=;
priority_queue<komeiji_satori> minv;
inline bool operator <(const komeiji_satori&A,const komeiji_satori&B){
return f[A.las]+a[A.now]>f[B.las]+a[B.now];
}
inline ll getans(){
while(!minv.empty()){
int las=minv.top().las,now=minv.top().now;
if(vis[now])minv.pop();
else return f[las]+a[now];
}
return INF;
} int main(){//freopen("test.in","r",stdin);freopen("tmp.out","w",stdout);
read(n),read(m);
for(register int i=;i<=n;++i){
read(a[i]);sum[i]=a[i]+sum[i-];
if(a[i]>m)return printf("-1\n"),;
}
for(register int i=;i<=n;++i){
while(sum[i]-sum[L]>m)++L;
while(l<=r&&a[q[r]]<=a[i])vis[q[r--]]=;
q[++r]=i;
while(l<=r&&q[l]<=L)vis[q[l++]]=;
vis[q[l]]=;
if(l<r)minv.push(komeiji_satori(q[r-],q[r]));//attention.
f[i]=_min(getans(),f[L]+a[q[l]]);
}
printf("%lld\n",f[n]);
return ;
}

poj3017 Cut the Sequence[平衡树+单调队列优化]的更多相关文章

  1. [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)

    DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...

  2. poj 3017 Cut the Sequence(单调队列优化 )

    题目链接:http://poj.org/problem?id=3017 题意:给你一个长度为n的数列,要求把这个数列划分为任意块,每块的元素和小于m,使得所有块的最大值的和最小 分析:这题很快就能想到 ...

  3. poj 3017 Cut the Sequence(单调队列优化DP)

    Cut the Sequence \(solution:\) 这道题出的真的很好,奈何数据水啊! 这道题当时看得一脸懵逼,说二分也不像二分,说贪心也不像贪心,说搜索吧这题数据范围怎么这么大?而且这题看 ...

  4. POJ 3017 Cut the Sequence (单调队列优化DP)

    题意: 给定含有n个元素的数列a,要求将其划分为若干个连续子序列,使得每个序列的元素之和小于等于m,问最小化所有序列中的最大元素之和为多少?(n<=105.例:n=8, m=17,8个数分别为2 ...

  5. POJ-3017 Cut the Sequence DP+单调队列+堆

    题目链接:http://poj.org/problem?id=3017 这题的DP方程是容易想到的,f[i]=Min{ f[j]+Max(num[j+1],num[j+2],......,num[i] ...

  6. POj3017 dp+单调队列优化

    传送门 解题思路: 大力推公式:dp[i]=min(dp[k]+max(k+1,i)){k>=0&&k<i},max(j,i)记为max(a[h]){h>k& ...

  7. BestCoder Round #89 02单调队列优化dp

    1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01  HDU 5944   水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...

  8. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  9. bzoj1855: [Scoi2010]股票交易--单调队列优化DP

    单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...

随机推荐

  1. ARM内核和架构

    转:深入浅谈,CPU设计原理          CPU的内部架构和工作原理 推荐一本书:编码的奥秘 一.ARM内核和架构 ARM产品越来越丰富,命名也越来越多.很多朋友提问: ARM内核和架构都是什么 ...

  2. LVS + KEEPALIVED + WINDOWS SERVER 2008 R2 ------高可用负载均衡(转)

    工作原理此处不作讲解,自己去官方网站学习(http://www.linuxvirtualserver.org),这里重点讲如何配置!注:最好从官方网站对其进行了解,不至于会对某些问题产生误解,尽管是英 ...

  3. phpQuery—基于jQuery的PHP实现(转)

    Query的选择器之强大是有目共睹的,phpQuery 让php也拥有了这样的能力,它就相当于服务端的jQuery. 先来看看官方简介: phpQuery is a server-side, chai ...

  4. mycat可以干什么

     单纯的读写分离,此时配置最为简单,支持读写分离,主从切换 分表分库,对于超过 1000 万的表进行分片,最大支持 1000 亿的单表分片 多租户应用,每个应用一个库,但应用程序只连接 Myca ...

  5. js高度line-height及宽度text-align:center居中插件

    1.高度居中---在高度设为100%,无法直接使用line-height:100%;会不起效果 这是用于应对height:100%的插件 /** * 高度居中函数,用于应对高度设为100%时的居中 * ...

  6. 基于RedHat发行的Apache Tomcat本地提权漏洞

    描述 Tomcat最近总想搞一些大新闻,一个月都没到,Tomcat又爆出漏洞.2016年10月11日,网上爆出Tomcat本地提权漏洞,漏洞编号为CVE-2016-5425.此次受到影响的主要是基于R ...

  7. spring + jodd 实现文件上传

    String tempDir = SystemUtil.getTempDir(); // 获得系统临时文件夹 String prefix = UUID.randomUUID().toString(). ...

  8. Rider

    听说你开发.NET还在用VS,小哥哥给你推荐全平台的Rider   本文地址:http://www.cnblogs.com/likeli/p/8461010.html 前言 .NET平台的开发一直都只 ...

  9. 深入Asyncio(十)异步解析式

    Async Comprehensions 目前已经学会了如何在Python中进行异步迭代,接下来的问题是这是否适用于解析式?答案是OJBK!该支持在PEP 530中提及,建议去读一下. >> ...

  10. UVA 10428 - The Roots(牛顿迭代法)

    UVA 10428 - The Roots option=com_onlinejudge&Itemid=8&page=show_problem&category=494& ...