传送门:最大子序和
思路:计算前缀和,单调队列存储下标,枚举求最小值 d[k]=d[k]-d[k-j] (1<=j<=m)
在前k个元素中长度<=m的序列的最大值,所以队列头应该是k-m~k中的最小前缀和。
代码:
- #include
- #include
- #include
- #include
- #include
- #include
- using namespace std;
- const int N=3e5+10;
- int n,m,ans,u;
- int d[N],q[N];
-
- int main()
- {
- cin>>n>>m;
-
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&d[i]);
- d[i]+=d[i-1];
- }
-
- int hh=0,tt=0,res=0;
- for(int i=1;i<=n;i++)
- {
- if(q[hh]
- res=max(res,d[i]-d[q[hh]]);
- while(hh<=tt&&d[q[tt]]>=d[i]) tt--;
- q[++tt]=i;
- }
- cout<
-
- return 0;
- }
-
相关阅读:
缺少win32spl.dll文件? 教你快速修复win32spl.dll
Logstash8.4在Linux系统上的安装以及配置Tomcat日志(ELK安装part2)(未完待续)
解密企业级PPPoE:部署、配置和管理的最佳实践
C语言AES加密解密字符串与16进制数据
前端如何防止数据被异常篡改并且复原数据
ASEMI二极管1N4148(T4)的用途和使用建议
一篇博客学会系列(2)—— C语言中的自定义类型 :结构体、位段、枚举、联合体
Linux从入门到精通(十二)——shell编程
监控与运维,主流it运维监控工具
企业应用架构研究系列二十六:信号量SemaphoreSlim与Semaphore
-
原文地址:https://blog.csdn.net/m0_62327332/article/details/126200254