URL:https://www.luogu.org/problem/P1714
質問の意味:
我々は、シーケンス番号$ N- $、$ kの間隔長が得られ、\当量M $の最大値が与えられます。($ N \の当量の5E5、m個\当量の5E2の$)。
ソリューション:
それは$最大(合計[Iを求めているので、タイトル要求$ MAX(合計[i]が-sum [j]は、(0 \当量IJ <M))$、直接暴力シークはTLEは、私たちは、データ構造を最適化する必要があります。 ] -sum [J]、(0 \当量IJ <M))$、すなわち$和[I] -min(合計[J]、[I-M + 1、i])と$でj個の\ので、単調最小増分キューを維持します。
ACコード:
書式#include <iostreamの> の#include <アルゴリズム> 書式#include <両端キュー> std名前空間を使用しました。 int型NUM [500005]。 長い長い合計[500005]。 構造体ノード { 長い長和。 int型のPOS。 ノード(長い長い、int型B) { 合計= A、POS = B。 } }。 INTメイン() { IOS :: sync_with_stdio(0)。 cin.tie(0)。 N INT、M。 CIN >> N >> M。 (I 1 = int型++ I; iが<= n)のための [I] CIN >> NUM [i]は、和[I] =和[I-1] + NUM。 長い長いANS = -0x3f3f3f3f。 両端キュー<ノード> MAXQ。 maxq.push_back(ノード(和[0]、0)); (; iが<= N; iは1 = int型I ++)用 { ANS = MAX(ANS、和[I] -maxq.front()合計。); (!。maxq.empty()&& maxq.back()合計> =合計[i])としばらく maxq.pop_back(); maxq.push_back(ノード(SUM [i]は、I))。 (maxq.front()POS <I-M + 1)一方 maxq.pop_front()。 } COUT << ANS << ENDL。 0を返します。 }