教育Codeforcesラウンド69 Dもう一つのサブアレイ問題

Dもう一つのサブアレイ問題

考え

  • この最大需要期間間隔条件を満たし、この式の特徴は、間隔mの長さを増加させること、である、マイナスのみK、M及びタイトルデータ範囲が小さいです。
  • 列挙が出発点とみなすことができるが、その後、我々は出発点を列挙し、更新の裏には、解決する方法を迅速に更新わかりません。
  • M-1位の前に列挙されたように、列挙されたMの数、0〜のM-1未満で見ることができます。位置、合計の追加の各m個の出発点後にはKを失うする必要があります。ミネソタ州は、(初期値が原因で最大値を取っていないと、0に設定され、それが0である)最小値を維持します。その後の列挙中に、Kを失うする必要性の前に毎回、見ミネソタ州を更新し、前の段落の最小値をとります。各更新応答RES = MAX(RES、和ミネソタ州)での列挙は、現在の接頭辞を表し、 - 特定の最小値の前に接頭辞と回答を更新します。
  • なぜそれの各点でのミネソタ州を更新していませんか?操作はすべての-k Mを表示されるようになるので、同じことが、それぞれがミネソタ州の更新、同じ周期間隔を指す場合、和ミネソタはkの値を小さくする必要がなくなり、-kの期間にわたって繰り返しことができません。サンプル実施例2、-4、15。

コード

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a[300005];
int main()
{
    int n, m, k;
    ll res = 0;
    scanf("%d%d%d", &n,&m,&k);
    for(int i=0;i<n;i++)scanf("%lld",&a[i]);

    for(int i=0;i<m;i++){
        ll minn=0;//最大为0
        ll sum=0;
        for(int j=i;j<n;j++){
            if(j%m==i){
                minn=min(sum,minn);
                sum-=k;
            }
            sum+=a[j];
            res=max(res,sum-minn);
        }

    }
    printf("%lld\n", res);
}

おすすめ

転載: www.cnblogs.com/gzr2018/p/11235913.html