jzoj4684。[8.11] GDOI2017アナログカードゲーム

天智の馬が問題この質問思っていました。貪欲から欲しいです。これは、考え抜かれました。ナイーブ

実際には、この質問は実際に天智の馬の問題であるが、操作を追加し、そう死ぬための単純なソート

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(11、N * 2、[i]は、1 )。
        I1(11、N * 2、B [i]は、0 )。
        F [I] = C1の[ 1 ]。
    } 
    ANS = MAX(ANS、F [N])。
    以下のためにint型 I = N; I; i-- ){ 
        I2(11、N * 2、[i]は、1 )。
        I2(11、N * 2、B [i]は、0 )。
        ANS = MAX(ANS、C2 [ 1 ] + F [I- 1 ])。
    } 
    のprintf(" %dの" 、ANS)。
}

 

おすすめ

転載: www.cnblogs.com/rilisoft/p/11106583.html