ツリーラインツリーのCF1000F一つ発生会長

質問の意味:

長さは所定のn個のシーケンスを、mは所定の間隔毎に求めて、クエリを[L、R&LT] 数値の範囲が存在する場合、一度だけ表示され、番号(複数の出力のいずれかの場合)を出力します全く出力しない0、N-、M <= 10 ^ 5。5 *

ソリューション:

  •  もしL未満のみの範囲内の数字は、その表示位置に現れる図面上の位置を維持するために、各クエリー間隔を検討
  • 影響を排除するように、しかし、2つの同一のセクションがある場合はLよりも左側の数以下でデジタル数字であってもよいです
  • だから、限り、あなたは木の会長に表示される数字の右端の桁上の各番号の位置を維持するよう、ツリーラインまたはオフラインプレフィックスとツリーを維持するために、オンラインで使用することができます
#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#defineっ長い長
 のconst  int型 N = 5E5 + 10 構造体ノード{ INTミネソタ州、NUM;} T [N << 6 ]。
ノードマージ(ノードA、ノードB)
{
    OW(a.minn <b.minn)リターン(ノード){a.minn、a.num}。
    他の リターン(ノード){b.minn、b.num}。
}
INTの LSON [N << 6 ]、rson [N << 6 ]、N、M、最後[N]、POS [N]、[N]、T [N]、NCNT。
のビルド(int型の L、int型のR、INTPOS)
{
    POS = ++ NCNT。
    もし(L == R){T [POS] =(ノード){ 10000000000 }。リターン;}
     int型、M =(L + R)>> 1 
    ビルド(L、M、LSONの[用POS]);ビルド(M + 1 、R、rson [POS])。
    T [POS] = マージ(T [LSON [POS]、T [rson [POS])。
}
ボイドアップノード(int型のx、int型 V、INTの NUM、int型の L、int型の R、INTプリ、INTPOS)
{
    POS = ++ NCNT。
    LSON [POS] = LSON [事前]。
    rson [POS] =のrson [事前]。
    T [POS] = T [事前]。
    もし(L == R){T [POS] =(ノード){V、NUM}。リターン;}
     int型、M =(L + R)>> 1 もし(x <= M)アップノード(X、V、NUM、L、M、LSON [事前]、LSON [POS])。
    他のアップノード(X、V、NUM、M + 1 、R、rson [事前]、rson [POS])。
    T [POS] = マージ(T [LSON [POS]、T [rson [POS])。
}
ノードQminを(int型 L、INT R、int型の L、int型の R、int型POS)
{
    もし(L <= 1 && R <= R)戻りT [POS]。
    ノード年 =(ノード){ 1000000000 }。
    INT、M =(L + R)>> 1 もし(L <= M)ANS = マージ(年Qminを(L、R、L、M、LSON [POS]))。
    もし(R> M)ANS =マージ(年Qminを(L、R、M + 1 、R、rson [POS]))。
    返す歳;
}
int型のmain()
{
    CIN >> nは、ノードANS。
    以下のためにint型私= 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。
    以下のためにint型 i = 1 ; iが<= N; iは++します
    {
        最後[i]は = POS [I]]。
        POS [I] = I。
    }
    (ビルド1、N、T [ 0 ])。
    以下のためにint型 i = 1 ; iが<= N; iは++します
    {    
        T [I] = T [I- 1 ]。
        アップノード(I、最後[i]は、[i]は、1 、N、T [i]は、T [I])。
        もし(最後の[i])と    
        {
            アップノード(最後の[I]、10000000001 、N、T [i]は、T [I])。
        }
    }
    cinを >>メートル。int型のL、R。
    しばらく(M-- 
    {
        scanf関数(" %dの%のD "、&​​L&R)。
        ANS = Qminを(L、R、1 、N、T [R])。
        もし(ans.minn <L)のprintf(" %d個の\ n " 、ans.num)。
        のprintf(" 0 \ N " );
    }
    リターン 0 ;
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/bxd123/p/11697536.html