トウモロコシにおける牙ボボ(フェンウィックツリー最適化)(三次元半順序)

滞在するzzn高齢者のがん問題......

まず、この質問は、最初の性質を理解します:

     我々は、高さ間隔を長くすることを選択した場合、我々が必要とするため、我々は、全体n個増加の左端に選択した点を増やす必要があります

最後に、それは損失でお金を失うことはありませんように単調、最大長のシーケンスの減少に。

その後、我々は、この問題の最後の点の最適な高さを決定[N] + Kで見出さ

配置されたアレイを意味F [j]は[k]は、操作のkはトウモロコシ高さjの現在のシーケンスの最大長を表します。

そして、我々は3話の部分の順序として表示この質問を置くことができます。

トウモロコシIの1.現在の位置、1-I-1転写によって

2.現在のトウモロコシの高さjは、1-jがから転送しました

3.現在のトウモロコシは、転写1-K-1、Kが操作されました

フェンウィックツリーのメンテナンス、K、(明らかに.....)とJ

(そう私たちの最初のループは、このように私たちの私が注文されることを確実にする、配列に書き込む必要がない、iは、メモリを節約するために、

実際には、I、J、K、必要に応じて、2はOKですが、まあメモリを節約するために.......)

注意点:

1.ときは逆サイクルk(kは明らかまあ.....現在の正のシーケンスならば、彼の挿入はビットkの現在の列挙に影響を与えます)

2.前処理はもちろん、することはできません、あなたの列挙に基づいに注意を払う必要があります

3.ans値は必ずしも最後のポイントを選択されていません

 

1つの#include <地図>
 2の#include <iostreamの>
 3の#include <cstdioを>
 4の#include <CStringの>
 5の#include <アルゴリズム>
 6の#include <cmath>
 7の#include < ストリング >
 8の#include <ベクトル>
 9  #定義 int型、長い長い
 10を 使用して 名前空間はstdを、
11  int型 C [ 511 ] [ 5501 ]。
12  INT [ 11001 ]。
13  int型MAXN。
14  int型 lowbit(int型X){ 返す - X&(; X)}
 15  のint ; N-、K
 16  空隙追加(int型 X、int型の Y、int型)SUM // Xいくつかの動作の高さのk y k番目の操作の
17  {
 18である     ためint型 I = X; Iは<= K + 1、I + = lowbit(I))
 19。     {
 20である         ためINT J = Y; J <= MAXN + K; J + = lowbit(J))
 21は         、{
 22である                C [I] [J] = MAX(C [I]、[J]、SUM);
 23である         }
 24      }
 25  }
26  int型の照会(int型のx、int型のY)
 27  {
 28       INT ANS = 0 29       のためにint型 ; I> = I = xで1 I- =; lowbit(I))
 30       {
 31の           ためのINT J = yであり、j> = 1 ; J- = lowbit(J))
 32            {
 33の                ANS = 最大(ANS、C [I] [J])。
34            }
 35       }
 36の      リターンANS。
37  }
 38  INT ANS =0 ;
39は、 メイン()符号付き
 40  {
 41      のscanf(" %のLLDの%のLLD "、&​​N&K)を、
42      のためにint型 I = 1 ; ++; iが<= N I)
 43      {
 44           のscanf(" %のLLD "、および[I])。
45           MAXN = MAX([I]、MAXN)。    
46      }
 47      のためのint型 i = 1 ; iは= N <; ++ I)
 48      {
 49          のためにINTJ = K; J> = 0 ; - j)の
 50          {
 51               INT番目=クエリ(J + 1、[I] + J)+ 1 ;
52               // のprintf( "DP [%のLLD] [%のLLD] =%LLDする\ n"、J、[I] + J)。
53の               ANS = MAX(目、ANS)。
54               追加(J + 1、[I] + J、TH)。   
55          }
 56      }
 57      // INT ANS =クエリ(K + 1、[N] + K)。
58      のprintf(" %LLDする\ n " 、ANS)。
59 }
コードの表示

 

 

 

 

おすすめ

転載: www.cnblogs.com/Wwb123/p/11272933.html
おすすめ