LuoguP1714 切蛋糕

不定长子段和~ 采用前缀和加单调队列来维护。

  • 我们通过 SrSl1 来表示子段 [l,r] 的和。其中, Si=Si1+Pi(前缀和)。

  • 求出:

maxi[1,N]{Siminj[iM,i){Sj}}

  • 其中,minj[im,i){Sj} 可以采用 单调队列 维护。

代码(复杂度 O(N)):

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<utility>
using namespace std;
int n,m,p,s,ans=-2147483647;
class monotonic_queue{
	int head,tail;
	bool ml;//true more, false less
	pair<int,int> node[500005];//提交时请增加至 N(电脑不分配内存QAQ)
	bool cmp(int x,int y){
		if(ml)return x<y;
		else return x>y;
	} 
	public:
		monotonic_queue(bool ml):ml(ml){head=1;tail=0;};
		void pushback(int position,int data){
			while(head<=tail&&(!cmp(node[tail].second,data)))tail--;
			node[++tail]=make_pair(position,data);
		}
		void popfront(int position){
			if(node[head].first<=position)head++;
		}
		int top(){return node[head].second;}
};
signed main(){
	scanf("%d%d",&n,&m);
	monotonic_queue inc(true);
	inc.pushback(0,0);
	for(int i=1;i<=n;i++){
		scanf("%d",&p);
		s+=p;
		ans=max(ans,s-inc.top());
		inc.pushback(i,s),inc.popfront(i-m);
	}printf("%d",ans);
	return 0;
}

posted @   robinyqc  阅读(18)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示