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;
}

最新文章

  1. git 学习
  2. 在iOS7中修改状态栏字体的颜色
  3. matplotlib中使用imshow绘制二维图
  4. Vnix的Logo设计
  5. Inno Setup入门(十六)&mdash;&mdash;Inno Setup类参考(2)
  6. Java 常用排序算法实现--快速排序、插入排序、选择、冒泡
  7. java编译出错信息汇总(更新)
  8. 关于TRIM的优化技巧
  9. linux下内存的统计和内存泄露类问题的定位
  10. nginx 配置访问 静态文件
  11. Python中常见的正则表达式符号
  12. 【bug记录】OS Lab4 踩坑记
  13. mac下进行连接pptp协议
  14. 「HNOI2016」序列 解题报告
  15. Android Menu用法全面讲解
  16. checkbox做全部选中,全部取消效果
  17. codeforces 980D Perfect Groups
  18. python消息队列Queue
  19. Cantor表(NOIP1999)
  20. dwz 分页 bug (选回 combox 第一个值时不执行 onchange)

热门文章

  1. (day29) 进程互斥锁 + 线程
  2. markdown(typora)基本语法
  3. SpringCloud之链路追踪整合Sleuth(十三)
  4. java迭代器 常用
  5. 网络安全-主动信息收集篇第二章SNMP扫描
  6. 差异---虐爆了yxs的 后缀数组裸题 板子题 单调栈的简单应用 字符串的基础理解考察题
  7. NOIP 模拟19
  8. beacon帧字段结构最全总结(三)——VHT字段总结
  9. 009.Kubernetes二进制部署kube-apiserver
  10. iOS定位--CoreLocation