(递推)Maximum Absurdity CodeForces - 332B

题意:有n个数,找两个不相交的长度为k的连续子区间,使得两子区间内元素和为最大

思路:现对得到的数据进行处理,求出以每个位置为结尾的长度为k的区间和,以及在该点之后最大的区间和及其位置,再进行遍历

状态转移:dp[i] = max(dp[i+1], sum[i]);//逆序
显然,代码是抄的

#include
#include
#include
using namespace std;
#define LL long long
const int maxn = 2 * 1e5 +100;
LL n,k,a[maxn],sum[maxn],mx[maxn],pos[maxn],i;
int main()
{
    scanf("%lld%lld",&n,&k);
    for(i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        sum[i] = sum[i-1] + a[i];
        if(i>=k) sum[i] -= a[i-k];
    }
    for(i=n;i>=k;i--){
        if(sum[i]>=mx[i+1]){
            mx[i] = sum[i];
            pos[i] = i;
        }
        else{
            mx[i] = mx[i+1];
            pos[i] = pos[i+1];
        }
    }
    LL ans = 0,pos1 = 0,pos2 = 0;
    for(i=k;i<=n;i++){
        LL sm = sum[i] + mx[i+k];
        if(ans

你可能感兴趣的:((递推)Maximum Absurdity CodeForces - 332B)