URL:http://codeforces.com/problemset/problem/1197/D
質問の意味:
これは、シーケンスの長さを与え、$ N- $ $ M $、$ k個の$($ N \の当量の3E5、m個の\当量10、k個の\当量の1E9の$)$ \ sum_ {i = L} ^ {R} a_iをを求めて、 -k \ lceil \ FRAC {R-L + 1} {M} \ rceilの$最大。
ソリューション:
どこへ行く最初の事はt3からt8で最大感とサブコラム、その後、直接WAです。インターバルのマイナス長ので問題を感じていない、実際には、記録間隔の長さは、オンラインプロセスを選択した場合でも、サブ列の長さの変化と、後でそれについて考えていません。期間未満を失う可能性があり、対応する値を差し引いた後に失われません。したがって、各数についての質問は唯一、つまり、$ jのの%mは==私が?$(I [0、M-1]で\)、そして右の時点でみましょう($ jのの%mを満たすために、その位置を列挙することができます== Kは$を$値を減算I $)は、新たなシーケンスを形成する新たなサブ配列、および列の最大値を検索します。それ以外の場合はマイナス$ kの$をリークします、解決するために右の時点で最大に達したときに更新してください。なぜ私は何をする必要がありますか?答えは、このような列挙は不要であると分類におけるマイナスkの対応する数に議論することができ、特定の列挙の右端に見出さなければならない、またはそれらは間隔の長さよりも大きくすることができる$ Mは$間隔だけマイナス1を発生します誤った結果の$ kは$。
ACコード:
#include <ビット/ STDC ++ H.> 使用して名前空間STD; ロングロングA [300005]、B [300005]; int型のmain() { int型N-、M、K; CIN >> M >> N-K; (用0 =私はint型、I <N - 、I ++)は CIN >> A [I]; ;長ロングマックス= 0、ANS = 0 Iがm <; Iは++)//列挙(I = 0 int型用位置k保存 { ため(INT J = 0を; J <N-; J ++) B [J]は[J] = - (J == I K%のM:0); //保存kはのために必要ですローカル処理 マックス= 0; のための(INT J = 0; J <N-; J ++) { マックス= MAX(マックス+ B [J]、0LL); //最もサブカラムを行い、 (jは%mを場合== I) ANS = MAX(ANS、マックス); //すべてのサブ列と最大値kは、対応する数だけデクリメントされることを保証する COUT << MAXX << ""。 } COUT << ENDL。 } COUT << ANS << ENDL。 0を返します。 }