単調なキュー - ゲーム

・今日の試験!しかし、ガチョウはバースト!

 

タイトル内容

1選択図】図
CZR 大学生が、彼はまだ家に遊び石蹴りをこっそりするのが好きです
0002の
CZRの家族が連続しているN + 1 から番号土地タイルの作品、0 Nを、彼はタイルのすべての部分にして
書かれていますつの番号に
彼はで開始0 番の床タイル、床タイル、このスコアが0 彼は各時間ステップバックジャンプします、
彼は最後にジャンプする必要はありません
なぜならジャンプしないように彼の能力を、彼は唯一のステップに行くことができますジャンプの後にL Rのグリッド、すなわち
タイル私を、彼は唯一のタイルをジャンプすることができ、私は+ Lをする+ Rは、レンガである
彼は試合の合計の割合を実施し、すべての彼のジャンプのタイルを獲得することです合計が
今、彼は彼らの数学の能力は非常に強力であることを証明するために、最もポイントを取得したいので、彼は必要
最大スコアがどのくらいである知っています

トピックの出所:山東省済南トレーニング試験2 2番目のタイトル

トピックのアイデア

彼は最高のスコアを取得することができるときF [i]は私格子CZRジャンプを表すようにします。
F [i]を= MAX(F [I - L] ... F [I - R])+ [I]。 ([i]は、点Iの割合を表します。)

我々は、( - [L I] Fをmaxに最適化したい 。... F [I - R])
。これは私が1-nが引き継がれた
だけで必要な間隔の最大値は、間隔の長さが固定されていることを意味します。

:そこが行うことができます多くの方法があり
、最も簡単な方法の一つは、単調なキューです
明らかに簡単な最適化問題単調キューで間隔が固定されている最大の間隔を、求めている、。
そして、キューの単調さは、チームとチームに分かれて、また非常に良い書き込みです単独の2つの段階。
単調時間の複雑さをキューはO(n)です。

そして、その問題を拡大、になることができます:
インターバル中の列数の最大値を尋ねる、間隔の長さが固定されていない
変更を加えることなく、ただ聞いているので、これは明らかに、STテーブルで
テーブルST上のクエリへの転送時間十分。
時間計算量はO(nlogn + N)です。

もちろんそうではない番目のテーブルには、まだやるべきことができます
:私たちは、その問題拡大
の3つの動作のセット:
番号を追加し、番号を削除し、コレクション内の要求の現在の最大数を。
唯一の現在のコレクション要求+内の数に参加するためにスタックの最大数は完了です。
あなたがして。削除するヒープメモリの数を作成することができます番号を削除するために
十分なヒープヒープの両方のトップの要素を参照してくださいたびにクエリを。
O(nlogn)の時間複雑。

ボード

書式#include <cstdioを> 
する#include <CStringの> 
の#include <アルゴリズム> 

std名前空間を使用しました。
const int型N = 500005; 

int型N、L、R。
[N] INT、[N] F。
int型のヘッド、テール; 
int型ANS; 

メインINT(){ 
	//freopen("jump.in」、 "R"、STDIN)。
	//freopen("jump.out」、 "W"、STDOUT)。
	scanf関数( "%Dを\ n"、&N); 
	scanf関数( "%dの%のD"、&L&R)。
	(; iが<= N I ++ iは1 = INT)のため
		のscanf( "%dの"、[I])。
	memsetの(F、0、はsizeof(F))。
	
	{(; iが<= N I ++ iはLを= INT)のための
		[I] 0 = F。
		用(INT J =分(0、I - R); J <= I - L; ++ j)は
			F [I] = MAX(F [I]、F [J])。
		F [I] + = [I]。
		年= MAX(年、F [i])と、
	}
	printf( "%d個の\ n"、ANS)。
	// fcloseを(STDIN); 
	// fcloseを(標準出力)。
	0を返します。
}

 

おすすめ

転載: www.cnblogs.com/konglingyi/p/11391081.html