CF1004Fソーニャとビット単位ORツリーライン

リンク

質問の意味:

 

 

ソリューション:

  • それはたくさんの木のラインのように見えます
  • あなたは20以下である各ベクトルはその複雑さが十分であることを保証するために、プレフィックスとサフィックスのセーブすべての点にベクトルを開くことができるように、または唯一の唯一のログレベルの合計を育てます
  • 組み合わせ答えたときにサフィックス区間の左と右のセクションの列挙に限り接頭辞  
  • 限り、左の部分木の最初のセットの一時右部分木として、その後、合併サフィックスサフィックスは、それが現在のサフィックスと同じであれば同じではありません最後に比較して、サフィックスを列挙またはベクトルのプレフィックスとサフィックスのためになるよう一緒に行くとき彼は後者がよりを把握言いました!
#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
CONSTの INT N = 1E5 + 100 #define llの長い長い
 int型N、M、X、[N]。
構造体のノード
{
    ベクトル <ペア< int型int型 >> 前、最後の;
    ANS LL;
    ノード(){年齢 = 0 ;}
} T [N << 2 ]。
LL getans(ノードと、ノード&B)
{
    LL ANS = 0 (オート&I:a.last)(オート&J:b.pre)
     の場合((i.first | j.first)> = x)のANS + =(LL)i.second * (LL)j.second。
    戻るANSを。
}
ノードpush_up(ノード&A、ノード&B)
{    
    もし(a.last.size()== 0リターンB。
    もし(b.last.size()== 0を返します
    ノードの一時。
    temp.ans = a.ans + b.ans。
    temp.ans + = getans(A、B)。

    temp.last = b.last。
    INT U = temp.last.back()最初。
    (オート&:a.last V)
    {    
        もし。((v.first | U)== U)temp.last.back()第二+ = v.second。
         temp.last.push_back({(v.first | U)、v.second})、U =(U | v.first)。
    }
    temp.pre = a.pre。
    U = temp.pre.back()最初。
    (オート&:b.pre V)
    {
        もし。((v.first | U)== U)temp.pre.back()第二+ = v.second。
         temp.pre.push_back({(v.first | U)、v.second})、U =(U | v.first)。
    }
    戻り温度;
}
のビルド(int型の L、int型の R、int型POS)
{
    もし(1- ==のR)
    {    
        T [POS] .last.push_back({[L]、1 })。
        T [POS] .pre.push_back({[L]、1 })。
        [POS]は.ans Tは = [L]> = X。
        返します
    }
    INT、M =(L + R)>> 1 
    (L、M、POS構築 << 1);ビルド(M + 1、R、POS << 1 | 1 )。
    T [POS] = push_up(T [POS << 1 ]、T [POS << 1 | 1 ])。
}
アップノード(あなた xxは、あなたは、V あなたがしているあなたがしているダウン、あなたPOS)
{
    もし(1- ==のR)
    {    
        [L] = V。
        [POS]は.ans Tは = [L]> = X。
        T [POS] .pre.clear(); T [POS] .last.clear()。
        T [POS] .pre.push_back({V、1 })。
        T [POS] .last.push_back({V、1 })。
        返します
    }
    INT、M =(L + R)>> 1 もし(XX <= M)アップノード(XX、V、L、M、POS << 1 )。
    他のアップノード(XX、V、M + 1、R、POS << 1 | 1 )。
    T [POS] = push_up(T [POS << 1 ]、T [POS << 1 | 1 ])。
}
ノードqsum(int型 L、INT R、int型の L、int型の R、int型POS)
{
    もし(L <= 1 && R <= R)戻りT [POS]。
    INT、M =(L + R)>> 1 
    ノード年。
    もし(L <= M)
    {
        ノードT = qsum(L、R、L、M、POS << 1 )。 = push_up(トン、年);
    }
    もし(R> M)
    {
        ノードT = qsum(L、R、M + 1、R、POS << 1 | 1 )。 = push_up(t年);
    }
    返す歳;
}
int型のmain()
{    
    CIN >> N >> M >> X。
    以下のためにint型私= 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。
    (ビルド1、nは、1)。int型のオペアンプ、U、V;
    しばらく(M-- 
    {
        scanf関数(" %D%D%D "、&​​OP&U、およびV)。
        もし(OP == 1)アップノード(U、V、1、nは、1 )。
        のprintf(" %LLDの\ nを"、qsum(U、V、1、nは、1 ).ans)。
    }
    リターン 0 ;
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/bxd123/p/11700504.html
おすすめ