天智の馬が問題この質問思っていました。。。貪欲から欲しいです。。。これは、考え抜かれました。。。ナイーブ
実際には、この質問は実際に天智の馬の問題であるが、操作を追加し、そう死ぬための単純なソート
Dクラスメートは、次のように:(デフォルトルールを大勝利のライセンスのために)貪欲な戦略をも表現することができる気づきました
昇順で1 D学生カード
小型からこのカードを削除することによって、そのブランドよりも第1のp以下の学生の手を見つけ、今このカードのために、各カードのDの学生を列挙大きな2.(なし削除しません)
別の同様のルール
我々は明らかに体重セグメントツリーを考慮し、暴力を維持することはできません
あなただけの一枚のカードを追加するたびに、単一のポイントの同等のは、あなたが直接にその重量に追加カードを追加するたびに変更します
各ノードは、学生だけでなく、いくつかのカードのL1 dのレコードを表し、R1は、pの学生は、いくつかのカードを持っています表し、c1は回答数を示します
各ノードL1の息子のために右の木の息子は、R1の除去放置した後、ノードにアップロード
なぜこれが正しいのですか?その後、あなたはカードや大Pカードの試合の最初の小さい方が、対応する値の間隔dを作ることができるので、試合は彼の息子がカードと良いD祖先と対応カードの広い範囲が小さいpの値と一致し、左せませんでした(ビットの周りに、ブロガーの鶏肉料理悪い言語は、ご了承ください)
限りrootアクセスの問い合わせを完了するために
最後に、N + 1のルールを変更する場合は、種のような最大値をとります
コード:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define N 100010 int型 N、[N]、B [N]、V [N]、[N] F、G [N]、L1 [N * 10 ]、R1 [N * 10 ]、C [N * 10 ]、L2 [N * 10 ]、R [N * 10 ]、C2 [Nの* 10 ]、ANS。 ボイド I1(INT O、int型の L、int型の R、int型のx、int型T){ 場合(L == R){ 場合(!T)L1 [O] ++ ; 他 R1 [O] ++ ; 返します。 } int型MD =(L + R)/ 2 。 もし(x <= MD)I1(O * 2 、L、MD、X、T)。 他 I1(O * 2 + 1、MD + 1 、R、X、T)。 C1 [O] = R 1 [O] = L1 [O] = 0 ; もし(L1 [O * 2 + 1 ]> = R1 [* O 2 ]){ C1 [O] + = R1 [O * 2 ]。 L1 [O] + = L1 [O * 2 + 1 ] -R1 [* O 2 ]。 } 他{ C1 [O] + = L1 [Oの* 2 + 1 ]。 R1 [O] + = R1 [O * 2 ] -L1 [O * 2 + 1 ]。 } R1 [O] + = R1 [O * 2 + 1 ]。 L1 [O] + = L1 [O * 2 ]。 C1 [O] + = C1 [O * 2 ] + C1 [O * 2 + 1 ]。 } ボイド I2(int型、O INTの L、int型の R、int型のx、int型T){ 場合(L == R){ 場合(!T)L2 [O] ++ ; 他 R2 [O] ++ ; 返します。 } INT MD =(L + R)/ 2 。 もし(x <= MD)12(O * 2 、L、MD、X、T)。 他 I2(O * 2 + 1、MD + 1 、R、X、T)。 C2 [O] = L2 [O] = R2 [O] = 0 ; もし(L2 [* O 2 > = R2 [O *] 2 + 1 ]){ C2 [O] + = R2 [O * 2 + 1 ]。 L2 [O] + = L2 [* O 2 -R 2] [O * 2 + 1 ]。 } 他{ C2 [O] + = L2 [O *2 ]。 R2 [O] + = R2 [O * 2 + 1 ] -L2 [O * 2 ]。 } R 2 [O] + = R2 [O * 2 ]。 L2 [O] + = L2 [Oの* 2 + 1 ]。 C2 [O] + = C2 [O * 2 ] + C2 [O * 2 + 1 ]。 } int型のmain(){ scanf関数(" %のD "、&N) 以下のために(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %dは"、& [I])。 V [i]は[] = 1 。 } int型 CT = 0 。 以下のために(int型 i = 1 ; iは= < 2 * N; iは++ ) 場合 B [++ CT] =(V [I]!)I。 (B逆 + 1、B + N + 1 )。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ I1(1、1、N * 2、[i]は、1 )。 I1(1、1、N * 2、B [i]は、0 )。 F [I] = C1の[ 1 ]。 } ANS = MAX(ANS、F [N])。 以下のために(int型 I = N; I; i-- ){ I2(1、1、N * 2、[i]は、1 )。 I2(1、1、N * 2、B [i]は、0 )。 ANS = MAX(ANS、C2 [ 1 ] + F [I- 1 ])。 } のprintf(" %dの" 、ANS)。 }