首页 > 其他分享 >单调队列

单调队列

时间:2023-08-09 19:22:21浏览次数:27  
标签:队列 int ans 序列 include 单调

单调性的原理可以用一句没有啥道理的但又有点道理的话理解:如果一个人比你小还比你强,你就永远打不过他了。

最大子序和

输入一个长度为 \(n\) 的整数序列,从中找出一段长度不超过 \(m\) 的连续子序列,使得子序列中所有数的和最大。

注意: 子序列的长度至少是 \(1\)。

转换成前缀和
选取区间\([x+1,y]\) 和是 \(s[y]-s[x]\) 最大且 \(y-x \le m\)

对于一个 \(y\)
\(x \in [y- m, y-1]\) 所以 \(s[x]\) 越小越好

如果一个后进队的元素 \(s[x]\) 比前面的 \(s[?]\) 更小,则他一定比前面那个元素更优

所以选取的策略是:下标位置递增,对应的前缀和也是递增
维护队列即可

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std ;

const int N = 300010 ;

int n, m, ans ;
int a[N], s[N], q[N] ;

int main() {
	scanf("%d%d", &n, &m) ;
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]) ;
		s[i] = s[i - 1] + a[i] ;
	}  
	int l = 1, r = 1 ; q[l] = 0 ;
	for (int i = 1; i <= n; i++) {
		while (l <= r && i - q[l] > m) l++ ;
		ans = max(ans, s[i] - s[q[l]]) ;
		while (l <= r && s[q[r]] >= s[i]) r-- ;
		q[++r] = i ;
	}
	printf("%d\n", ans) ;
}

标签:队列,int,ans,序列,include,单调
From: https://www.cnblogs.com/lighthqg/p/17617816.html

相关文章

  • 复习消息队列之RabbitMQ
    概念:RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。对比:RabbitMQ对......
  • 单调栈
    LargestRectangleinaHistogram经典题单调栈:保持栈内元素单调递增因为如果递减后面的元素的高度就会替换前面的元素的高度前面元素等价于多个后面元素当有新元素加入是将原先的递增序列从后往前更新答案最后使得栈保持原有性质这样可以保证每个元素只会被考虑一次,不用......
  • 单调栈算法
    单调栈算法单调栈,就是一个栈,不过栈内元素保证单调性。即,栈内元素要么从小到大,要么从大到小。//单调栈算法#include<bits/stdc++.h>#defineregregisterusingnamespacestd;//读取输入,并返回一个整数inlineintread(){ intx=0,f=1; charch=getchar(); while(ch<'......
  • [代码随想录]Day11-栈与队列part03
    题目:239.滑动窗口最大值思路:说实话这题真不能说是困难题,麻烦是麻烦点但是比较容易实现。维护一个单调队列,队列内是由大到小排序(数组内的顺序是由小到大的),每次移动都会进行两次判断:如果前面去掉的数就是队列的首部,那么就要把首部移除如果后面添加的数比队尾的元素要大就......
  • 多重背包 (单调队列)
    题目链接#include<bits/stdc++.h>usingll=longlong;constintN=1E3+5,M=2E4+5;intn,m;intv[N],w[N],s[N];intf[M];intl,r,q[M];intcalc(inti,intu,intk){ returnf[k*v[i]+u]-k*w[i];}intmain(){ std::ios::sync_with_......
  • dijkstra + 单调栈优化
    打Div.3发现两个最短路板子题一个用的SPFA一个用的邻接矩阵,赶紧补个。#include<iostream>#include<queue>#defineMAXN20010usingnamespacestd;constintinf=2147483647;intn,m,s,t,cnt;intdis[MAXN],h[MAXN],to[MAXN],val[MAXN],nxt[MAXN];boolvis[MAXN]......
  • 王道408用数组,链表以及双向链表实现栈、队列
    我在电脑上敲了一遍,又在纸上模拟了一遍下面记录在电脑上敲的:一、用数组实现栈#include<stdio.h>#include<string.h>#defineMaxSize50typedefstruct{intdata[MaxSize];inttop;}stack;voidInitStack(stack&S){S.top=-1;S.data[0]=5;......
  • [代码随想录]Day10-栈与队列part02
    题目:20.有效的括号思路:很简单的一个栈的题目:如果是左括号就存如果是右括号就和栈顶的匹配匹配失败就返回false匹配成功就删除栈顶元素如果结束后是空就说明匹配完成这里需要注意的一个点是可以用map来代替过多的ifelse,希望能学会!代码:varpairs=map[byte]byte{......
  • 【数据结构 | 入门】堆栈与队列(问题引入&实现&算法优化)
    ......
  • 代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈
    232.用栈实现队列   卡哥建议:大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。  题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html   做题思路:   记住栈和队列的......