羅区P1714はケーキ単調なキューをカット

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を返します。
}

 

 

おすすめ

転載: www.cnblogs.com/Aya-Uchida/p/11300611.html