[洛谷P1714]切蛋糕

题目大意:给你n个数,要你求一段长度不超过k的、和最大的连续子序列,问你最大的和是多少。

解题思路:单调队列+前缀和优化。

可以发现,i到j的和与k到j的和,当j变化时,这两个和的相对大小关系是不变的。

我们用单调队列保存与当前第i个位置距离小于k(等于则不能加到)的位置,并让这个位置加到i的和单调递减。

这样就能保证每次从队头弹出时,之后的和仍是最大。

求一段连续序列的和就用到前缀和优化。

总时间复杂度$O(n)$。

C++ Code:

#include
#include
#define N 500005
int n,k,a[N],sa[N],q[N<<1],h,t;
inline int max(int a,int b){return asa[i]-sa[q[t]-1])--t;
        q[++t]=i;
        ans=max(ans,sa[i]-sa[q[h]-1]);
    }
    printf("%d\n",ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/Mrsrz/p/7811350.html

你可能感兴趣的:(c/c++)