传送门:最大子序和
思路:计算前缀和,单调队列存储下标,枚举求最小值 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;
- }
-
相关阅读:
vue使用.filter方法检索数组中指定时间段内的数据
2022年最新编辑Linux基础知识总结
05_不同路径2(带障碍物版)
vue-cli3项目本地启用https,并用mkcert生成证书
C#Web开发之blazor体验
Kafka 为什么会丢消息?(案例)
销售火爆,APS自动排产提升咖啡机家电企业生产管理效益
【NOIP2018提高组/洛谷题解/AcWing题解/计蒜客题解】货币系统
eyb后端项目搭建(一)
linux中断(中断一)
-
原文地址:https://blog.csdn.net/m0_62327332/article/details/126200254