質問の意味:
長さnは、m回の問い合わせの配列、所定の間隔に[A、B]は、タスクは[A、B]この点bから来るように配列が最も貪欲な上昇から点を選択することです長い、最長の配列の長さの出力。貪欲な立ち上がり部分配列は、を参照し、各キュー(最長の上昇シーケンス異なる)に参加するためにテール電流のチームの値よりも大きい値の顔。
ソリューション:
[i]のために考えてみましょう、それはこれらの場所への答えに影響を与えます。
明らかに、[i]は、意志のために私は貢献をもたらす(LAS [I]より大きいかまたは1つのA [i]の位置に等しい)(LAS [I] +1)〜回答開始位置から。これらの点から、どんなに行く、私はいつも来るので、答えは1になるので。
このデータのより大きな問題に起因して、我々はオフラインで、右端に応じてソートすることができ、それぞれの添加I、プット([i]が1ラス)〜全ての位置I + 1。ちょうど缶に[a、b]での最大値を見つけるために必要な答えを探しています。メンテナンスセグメントツリーは、上記の操作とクエリで解決することができます。
書式#include <cstdioを> する#include <アルゴリズム> 書式#include <cstdlib> 使用して 名前空間をSTD。 整数 N、M、[ 1500002 ]、ANS [ 1500002 ]、T [ 1500002 ]、lenの、C [ 1500002 ]。 typedefは構造体{ int型のL、R、NUM。 } P。 typedefは構造体{ int型マックス、F。 } PP。 PとP [ 1500002 ]。 PPのXDS [ 6000002 ]。 INTはREAD(){ int型 F = 0。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 ')CH = GETCHAR()。 一方、(CH> = ' 0 ' && CH <= ' 9 '){F = F * 10 + CH- 48、CH = GETCHAR();} 戻りF。 } ブールCMP(PのAA、BB P){ リターン(aa.r < bb.r)。 } ボイドプッシュダウン(INT ルート){ 場合(XDS [ルート] .F) { SNA [ルート * 2 ] + = .MAXカニ[根] .F:SNA [ルート* 2 + 1 ] + = .MAXのカニ[根] .F。 SNA [ルート * 2 ] + = .Fカニ[根] .F:SNA [ルート* 2 + 1 ] + = .F カニ[根] .F。 SNA [ルート] .F = 0 。 } } ボイド gengxin(int型の根、INT、開始INTの端を、INT begin2、INT END2){ 場合(開始> END2 ||端<begin2)のリターン; もし(<=> = begin2 &&エンドを始めるEND2) { SNA [ルート] .MAX ++:SNA [ルート] .F ++ ; リターン; } int型の半ば=(+終了を開始)/ 2 ;プッシュダウン(ルート)。 gengxin(ルート * 2、開始、MID、begin2、END2); gengxin(ルート* 2 + 1、MID + 。1 、エンド、begin2、END2)。 SNA [ルート] .MAX = MAX(SNA [ルート* 2 ] .MAX、カニ[根* 2 + 1 ] .MAX)。 } int型 chaxun(INTの根、INT、開始INTの端を、INT begin2、INT END2){ 場合(開始> END2 ||端<begin2)戻り 0 ; もし(開始> = begin2 &&端<= END2)戻りXDS [ルート] .MAX。 int型の半ば=(+終了を開始)/ 2 ;プッシュダウン(ルート)。 リターン MAX(chaxun(ルート* 2、始まり、半ば、begin2、END2)、chaxun(ルート* 2 + 1、ミッド+ 1 、終わり、begin2、END2)); } int型のmain() { N =読み取る(); M =は(読み取り) 以下のために(INT iが= 1 ; I <= N; I ++)[I] = )(読み取ります。 以下のために(INT iが= 1 ; I <= M; I ++ ) { P [i]は.L =読み取る(); P [I] .R = read()は、Pを[I] .num = I。 } ソート(P + 1、P + M + 1 、CMP)。 INT、L = 1 。 以下のために(INT iが= 1 ; I <= N; I ++ ) { 一方、(LEN && [T [LEN] <[i])とlen-- 。 gengxin(1、1、T、N- [LEN] + 1 、I)。 T [ ++ LEN = I。 一方、(L <= M && P [L] .R <= I) { 年[P [T] .num] = chaxun(1、1 、N、P [T] .L、P [T]×)。 L ++ ; } } 以下のために(INT iが= 1のprintf(; I <= M I ++)を" %D \ n " 、ANS [I])。 リターン 0 ; }