Max Sum of Max-K-sub-sequence(单调队列)

#include "bits/stdc++.h"

using namespace std;
const int N = 100005;
int s[N<<1],v[N<<1];
int t,n,k;
deque<int>d;
void init(){
    d.clear();
    memset(s,0,sizeof s);
    memset(v,0,sizeof v);
    cin >> n >> k;
    for(int i=1 ;i<=n;i++){
        cin >> s[i];
        s[i+n]=s[i];
    }
    for(int i=1;i<=n<<1;i++){
        v[i] = v[i-1] + s[i];
    }
}
void solve(){
    init();
    int ans =INT_MIN , l,r;
    for(int i=1 ; i<=n+k-1;i++){
        while (!d.empty() && d.front() <= i - k - 1 ) d.pop_front();    // 弹头
        while (!d.empty() && v[i-1] < v[d.back()]) d.pop_back();    //弹尾 保持最小值
        d.push_back(i-1);
        if(ans < v[i] - v[d.front()]){
            l = d.front()+1;
            r=i;
            ans = v[i] - v[d.front()];
        }
    }
    if(r>n)r=r%n;
    if(l>n)l=l%n;
    cout << ans << " " << l << " "  << r << endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin >> t;
    while (t--){
        solve();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_53013914/article/details/121151603