Luogu P1714

题目的大意就是给定一个长度为n的序列,求出这个序列中长度不超过m的子串的最大和

很容易想出的一个解法就是枚举起点终点,直接暴力扫一遍得出答案。

当然也很容易发现这种做法肯定会TLE。

也有一个很容易想到的优化方法——利用前缀和。

但是我们会发现即便如此,还是会TLE。

也就是说枚举这条路看起来走不通的样子……

那么我们换一个思路

依然是利用前缀和的思想,首先观察部分和的公式:

sum[i~j]=sum[j]-s[i-1]。

如果我们目标区间内使被减数尽可能大,减数尽可能小,就可以保证sum[i~j]最大。

同时维护被减数最大减数最小好像比较麻烦……

那么我们可以换一个方向思考:

维护一个动区间内的最小减数,然后枚举被减数即可

什么样的数据结构可以满足这样的操作呢?

很明显,线段树单调队列可以做到。

Code time:

//其实可以手写一个单调队列,但是最近学习一些有关类的知识就顺便练练手了。
//代码还是很好懂的,即使没学过应该也能轻松看懂
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
class queue
{
int x[5000005],head,tail;
public:
void set()
{
head=1;
tail=1;
memset(x,0,sizeof(x));
}
void push_back(int y)
{
x[tail++]=y;
}
void pop_front()
{
head++;
}
bool empty()
{
return head==tail;
}
void pop_back()
{
tail--;
}
int back()
{
return x[tail-1];
}
int front()
{
return x[head];
}
//由于stl自带的queue只支持队头弹出,deque又不会用,于是手写了一个类。
//(大概算是面向对象编程的首次尝试?)
}que;
int n,m,a,sum[500005],ans;
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%d",&a);
sum[i]=sum[i-1]+a;//前缀和预处理
}
que.set();
for (int i=1;i<=n;i++)
{
while (sum[que.back()]>sum[i]&&!que.empty()) que.pop_back();
que.push_back(i);
if (i-que.front()>m&&!que.empty()) que.pop_front();
ans=max(ans,sum[i]-sum[que.front()]);
}//单调队列基本操作
printf("%d",ans);
return 0;
}

【Luogu P1714】切蛋糕(面向对象编程首次尝试?)的更多相关文章

  1. luogu P1714 切蛋糕 单调队列

    单调队列傻题. 考虑以 $i$ 结尾的答案 : $max(sumv_{i}-sumv_{j}),j \in [i-m,i-1]$ ($sumv_{i}$ 为前缀和) 稍微搞一搞,发现 $sumv_{i ...

  2. 洛谷 P1714 切蛋糕 题解

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

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

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

  4. 洛谷—— P1714 切蛋糕

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

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

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

  6. P1714切蛋糕(不定区间最值)

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

  7. P1714 切蛋糕 单调队列

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

  8. [洛谷P1714]切蛋糕

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

  9. 洛谷P1714切蛋糕

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

随机推荐

  1. vue 动态数据绑定

    动态数据绑定(一) 我的github iSAM2016 实现的步骤: 1.监听对象属性的读取与变化 Object.defineProperty() 方法会直接在对象上定义一个新的的属性,或者已经存在的 ...

  2. C/C++语言误区void main( )

    很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的.C/C++ 中从来没有定义过void main( ) .C++ 之父 Bjarne Stroustrup 在他的主页上的 ...

  3. node.js的File模块

    1.Node.js是什么? (1) Nodejs是为了开发高性能的服务器而诞生的一种技术 (2) 简单的说 Node.js 就是运行在服务端的 JavaScript,基于V8进行运行 (3) Node ...

  4. C++学习笔记1_ 指针.引用

    1.引用的本质struct typeA{ int &a;}struct typeB{ int *a;}int main(void){ cout<<sizeof(struct typ ...

  5. Python实现王者荣耀小助手(一)

    简单来说网络爬虫,是指抓取万维网信息的程序或者脚本,Python在网络爬虫有很大优势,今天我们用Python实现获取王者荣耀相关数据,做一个小助手: 前期准备,环境搭建: Python2.7 sys模 ...

  6. python习题——随机整数生成类

    随机整数生成类 可以先设定一批生成数字的个数,可设定指定生成的数值的范围 1.普通类实现 import random import random class RandomGen: def __init ...

  7. PHP常用的header头部定义

    <?php header('HTTP/1.1 200 OK'); // ok 正常访问 header('HTTP/1.1 404 Not Found'); //通知浏览器 页面不存在 heade ...

  8. 深入理解计算机系统 第十章 系统级I/O

    很多高级语言都提供了执行 I/O 的较高级别的函数.为什么我们还要学习 Unix I/O? 原因:1.由于 I/O 和其他系统概念之间有循环依赖关系,故了解 Unix I/O 将帮助我们理解其他的系统 ...

  9. 使用 Zephir 轻松构建 PHP 扩展

    简介: 通过 PHP 扩展, 我们可以在 php 代码中使用一些特定的方法(大部分的 php 扩展都是用 C 写的). 比如,在 PHP 中需要与 SQLite3 交互,我们可以自己写方法与之进行连接 ...

  10. Ubuntu清空回收站

    ubuntu 回收站的具体位置:$HOME/.local/share/Trash/ 执行如下命令清空回收站: sudo rm -fr $HOME/.local/share/Trash/files/ 如 ...