题目描述
给你一个长度为 nn 的整数序列 \{A_1,A_2,\cdots ,A_n\}{A1,A2,⋯,An},要求从中找出一段连续的长度不超过 mm 的子序列,使得这个序列的和最大。
输入
第一行为两个整数 n,mn,m;
第二行为 nn 个用空格分开的整数序列,每个数的绝对值都小于 10001000。
输出
仅一个整数,表示连续长度不超过 mm 的最大子序列和。
样例输入 Copy
6 4 1 -3 5 1 -2 3
样例输出 Copy
7
提示
数据范围与提示
对于 50\%50% 的数据,1\le N,M\le 10^41≤N,M≤104;
对于 100\%100% 的数据,1\le N,M\le 2\times 10^51≤N,M≤2×105。
分析:
1.使用暴力肯定会超时
2.所以用双向队列模拟(deque)具体用法见代码
题解:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,i,j,x,s[1000000];
deque<ll> q;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(ll i=1;i<=n;i++){
cin>>x;
s[i]=s[i-1]+x;
}q.push_back(0);
ll ans=-0x7f;
for(ll i=1;i<=n;i++){
while(!q.empty()&&q.front()<i-m)q.pop_front();
if(q.empty())ans=max(ans,s[i]);
else ans=max(ans,s[i]-s[q.front()]);
while(!q.empty()&&s[q.back()]>=s[i])q.pop_back();
q.push_back(i);
}
cout<<ans;
return 0;
}