题面

今天是小Z的生日,同学们为他带来了一块蛋糕。这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值。

小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大,但小Z最多又只能吃M小块(M≤N)的蛋糕。

吃东西自然就不想思考了,于是小Z把这个任务扔给了学OI的你,请你帮他从这N小块中找出连续的k块蛋糕(k≤M),使得其上的幸运值最大。


不定区间长度还是第一次遇到

分析 考虑朴素写法,非常直观。

对于以第i个元素结尾的子段,最大的子段和P(i)可以表示为

P [ i ] = max { sum [ i ] - sum [ j ] , j 属于 [ i-M, i-1 ]

于是有ans = max [ P [ i ] ]

算法的复杂度是O ( N M )

在题目的范围下TLE是必然的

将上面P[i]的计算式改写为

P [ i ] = sum [ i ] - min { sum [ j ] },j属于 [ i-M , i-1 ]

显然,在每次获取 P [ i ] 的时候,Sum [ i ] 是定值,所以 P [ i ] 由 Sum [ j ] 的最小值确定。

于是我们就要想方设法在优于O(M)的时间内实现获取最小的 Sum [ j ] 。

最优时,Sum [ j ] 的性质:

(1)Sum [ j ] ≤ Sum [ x ]  x∈ [ i-M , i-1 ]且x≠j

(2)j∈[ i-M , i-1 ]

枚举加优化

考虑设计这样一个数据结构,在更低的时间复杂度内获取最优Sum [ j ] 。

①单调队列

#include <iostream>
using namespace std;
#define max(a,b) (a>b?a:b)
const int maxn=;
int a[maxn],zhui[maxn];
int q[maxn],p[maxn],ans=-,spfa[maxn];
int main()
{
int n,m,tail=,head=;
cin>>n>>m;
for(int i=;i<=n;i++)
{
cin>>a[i];
zhui[i]=zhui[i-]+a[i];
}
for(int i=;i<=n;i++)
{
while(tail>=head&&q[tail]>=zhui[i]) tail--;
q[++tail]=zhui[i];p[tail]=i;
while(p[head]+m<=i) head++;
spfa[i]=q[head];
}
for(int i=;i<=n;i++)
ans=max(ans,zhui[i]-spfa[i-]);
cout<<ans;
}

②ST稀疏表

#include <bits/stdc++.h>
using namespace std;
const int maxn=;
int a[maxn],zhui[maxn];
int ans=-,dis[maxn][];
int query(int l,int r){
int k=log2(r-l+);
return min(dis[l][k],dis[r+-(<<k)][k]);
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=;i<=n;i++)
{
int t;
cin>>t;
zhui[i]=zhui[i-]+t;
dis[i][]=zhui[i];
}
for(int j=;j<=log2(n);j++)
{
for(int i=;i+(<<j)-<=n;i++)
dis[i][j]=min(dis[i][j-],dis[i+(<<(j-))][j-]);
}
for(int i=;i<=n;i++)
{
int l=i-m;//等于是求i-m+1到第i项
if(l<) l=;
ans=max(ans,zhui[i]-query(l,i));
}
cout<<ans;
}

P1714切蛋糕(不定区间最值)的更多相关文章

  1. 洛谷 P1714 切蛋糕 题解

    P1714 切蛋糕 题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运 ...

  2. 洛谷 P1714 切蛋糕 单调队列

    这个题比较显然,要用前缀和来做.但只用前缀和是过不去的,会TLE,所以需要进行优化. 对于每个前缀和数组 b 中的元素,都可以找到以 b[i] 结尾的子段最大值 p[i],显然,最终的 ans 就是 ...

  3. 【洛谷】【动态规划+单调队列】P1714 切蛋糕

    [题目描述:] 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大,但 ...

  4. P1714 切蛋糕 单调队列

    题目: 题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大, ...

  5. 洛谷—— P1714 切蛋糕

    https://www.luogu.org/problem/show?pid=1714 题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每 ...

  6. P1714 切蛋糕 dp+单调队列

    题意: 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到 ...

  7. [洛谷P1714]切蛋糕

    题目大意:给你n个整数,求出其中长度不超过m的最大字段和. 题解:单调队列维护前缀和最小值,然后用当前值减去当前有效最小值即可 C++ Code: #include<cstdio> usi ...

  8. 洛谷P1714切蛋糕

    题目 该题目就是求这n个数的前缀和所组成的数组的所有子区间的左端点和右端点相差不超过m,且他们的前缀和差最大,求出这个最大值即可. 而朴素算法肯定会T,而我们发现如果前缀和最大的话,则前缀和的值一定是 ...

  9. 洛谷P1714 切蛋糕(单调队列)

    先放代码...... 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e5+10,M=0x3f3f3f3f; ...

随机推荐

  1. [译]HAL-超文本应用语言

    [译]HAL-超文本应用语言 精益超媒体类型 总结 HAL 是一种简单的格式,它提供了一种一致且简便的方法在 API 的资源之间进行超链接. 采用 HAL 将使您的 API 易于探索,并且其文档很容易 ...

  2. web.page.regexp用法(全网唯一)

    前言 因为这个东西“web.page.regexp”,差点把自己杀了.一点都不夸张,这将近30度的天气,办公室不开空调,又要闷,还要带着口罩,躁动的很.加上这个鬼东西“web.page.regexp” ...

  3. 浅谈requests库

    本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 安装 pip install requests # 是requests而不是request(有s的) re ...

  4. Jquery+php鼠标滚动到页面底部自动加载更多内容,使用分页

    1.index.php <style type="text/css"> #container{margin:10px auto;width: 660px; border ...

  5. 同事上班时间无聊,用python敲出贪吃蛇游戏打发时间

    自从学会啦python,再也不用担心上班时间老板发现我打游戏啦 贪吃蛇代码: 还有不懂的(https://www.ixigua.com/i6808019824560570888/)这里有视频教程. 如 ...

  6. PIL库之图片处理

    (1)对图片生成缩略图 from PIL import Image im = Image.open("C:\Users\litchi\Desktop\picture1.jpg") ...

  7. python3_learn 实现文件夹内批量对图片重命名

    初衷 练习Python,提高动手能力. 珍藏的壁纸文件夹名命有点乱. 可以学习下一些基础的库 开始(.jpg,无筛选) First 首先找到OS库,寻找可以遍历文件名的.找到了OS.walk() os ...

  8. C#栈、堆的理解(2)

    接上一遍博文有关值类型和引用类型的相关概念. 所有值类型数据存放:栈(内存) 引用类型的数据存放:堆(内存) 栈:可以认为是一本书的目录部分称其为栈.栈可快速检索,运行速度比堆大,而且栈的空间小得多. ...

  9. python 进阶篇 浅拷贝与深拷贝

    阐述引用.浅拷贝和深拷贝前,首先需要要了解 Python 的世界里,一切皆对象,每个对象各包含一个 idendity.type 和 value. 引用(Reference) >>> ...

  10. 数据结构(C语言版)---排序

    1.排序:重排表中元素. 2.根据数据元素是否完全在内存中,将排序算法分为内部排序和外部排序两类. 3.插入排序:将一个待排序记录按关键字大小插入到前面已排好的子序列中,直到全部记录插入完成. 1)直 ...