洛谷 - P1714 切蛋糕(单调队列+前缀和+思维)

题目链接:点击查看

题目大意:给出一个由n个数组成的序列,求长度不超过m的连续子段和中的最大值

题目分析:因为给出了一个限制条件,所以这就不能当普通的动态规划来做了,我们可以跑一遍前缀和,然后枚举每一个位置当做子段和截止的位置,用单调队列维护区间[i-m,i]中的最小值,最小值的下标记为j,这样就能让a[i]-a[j]最大了

很巧妙的思路。。真的想不到,可能思维太菜了吧

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
 
typedef long long LL;
 
const int inf=0x3f3f3f3f;
 
const int N=5e5+100;

int a[N];

int main()
{
//	freopen("input.txt","r",stdin);
//	ios::sync_with_stdio(false);
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",a+i);
		a[i]+=a[i-1];//前缀和
	}
	dequeq;//维护最小值的下标
	int ans=-inf;
	for(int i=1;i<=n;i++)
	{
		while(q.size()&&a[q.back()]>=a[i])
			q.pop_back();
		q.push_back(i);
		while(q.size()&&q.front()

 

你可能感兴趣的:(单调栈/单调队列,思维,思维,单调队列,前缀和)