・今日の試験!!しかし、ガチョウはバースト!!
・タイトル内容:
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を返します。 }