P4592 [TJOI2018] XORツリーチェーン分割01trie

 

 

メンテナンス上のTreeセクションでは、永続01trieすることができ

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define担当者(I、B)(I =(A)がINT;方には<=(B); iが++)
 の#define repp(I、B)(I =(A)がINTのために、I> = (B); - I)
 の#defineは長い長いっ
 の#defineは(X)(CERR <<(#X)<< '=' <<(X)<< ENDL)を参照
 の#define INF 0x3f3f3f3f
 の#define CLR( 、V)のmemset(A、V、はsizeof A)
 ///////////////////////////////// / 
CONST  INT N = 2E6 + 10 INT T [N]、SIZ [N << 5 ]、T [N << 5 ] [ 2 ]、NCNT。
アップノード(int型 K、INTプリ、INTPOS)
{ 
    POS = ++ NCNT。
    SIZ [POS] = SIZ [事前] + 1 
    T [POS] [ 0 ] = T [事前] [ 0 ]。
    T [POS] [ 1 ] = T [事前] [ 1 ]。
    もし(K < 0のリターン;
    INT C =(ヴァル>> K)&1 
    アップノード(k - 1 、ヴァル、T [事前] [C]、T [POS] [C])。
} 
INT Qmaxの(INT K、INTヴァル、INTプリ、int型POS) 
{
    もし(K < 0戻り 0 ;
    INT C =(ヴァル>> K)&1 int型の SI = SIZ [T [POS] [C ^ 1 ] - SIZ [T [事前] [C ^ 1 ]。
    もし(SI)リターン1 << K)+ Qmaxの(K- 1、ヴァル、T [事前] [C ^ 1 ]、T [POS] [C ^ 1 ])。
     戻り Qmaxの(K- 1 、ヴァル、T [事前] [C]、T [POS] [C])。
} 
int型のヘッド[N]、トップ[N]、POS、ID [N]、TOT、FA [N]、DEP [N]、息子[N]、SIZ [N]、N、M、ノード[N]。
構造体のエッジ{ INT NEX、へ;}エッジ[N << 1];
ボイド追加(INT A、INT B){エッジ[++ POS] =(エッジ){B、ヘッド[A]};ヘッド[A] = POS;} 

ボイド DFS1(int型のx、int型F)
{ 
    FA [X ] = F; DEP [X] = DEP [F] + 1 ; SIZ [X] = 1 ;息子[X] = 0 ;
    以下のためにint型 ; I I = I =ヘッド[X] エッジ[I] .nex)
    { 
        int型 V = エッジ[I] .TO。
        もし(vは== f)を続けます
        DFS1(V、x)は、SIZ [X] + = SIZ [V]。
        もし(SIZ [息子[X] <SIZ [V])息子[X] =V; 
    } 
} 
ヴァル)をボイド DFS2(int型のx、int型topf)
{ 
    トップ[X] = topf; ID [X] = ++ TOT。
    アップノード(30、ノード[X]、T [tot- 1 ]、T [TOT])。
    もし(息子[X])DFS2(息子[X]、topf)。
    以下のためにint型 ; I I = I =ヘッド[X] エッジ[I] .nex)
    { 
        int型 V =エッジ[I] .TO。もし(V == FA [X] || V ==息子[X])続けます
        DFS2(V、V); 
    } 
} 
int型 Qmaxを(int型のx、int型の Y、INT 
{ 
    INTを ANS = 0 一方(上部[X] =!トップ[Y])
    {    
        場合(DEP [TOP [X] < DEP [トップ[Y])スワップ(X、Y)
        ANS = MAX(ANS、Qmaxと(30、ヴァル、T [ID [TOP [X]] - 1 ]、T [ID [X]]))。
        X = FA [TOP [X]]。
    } 
    もし(DEP [X]> DEP [Y])スワップ(X、Y)
    ANS = MAX(ANS、Qmaxと(30、ヴァル、T [ID [X] - 1 ]、T [ID [Y]]))。
    戻るANSを。
} 
int型のmain()
{    
    scanf関数(" %D%dの"、&​​N、&M)。
    担当者(I、1、N)
    のscanf(" %dの"、およびノード[I])。
    担当者(I、1、N- 1 
    { 
        int型、B; scanf関数(" %dの%のD "、&​​、&B)。
        (B)の追加;(B、A)を加えます。
    } 
    DFS1(10 ); 
    DFS2(11)。INTのX、Y、Z、OP。
    一方、(M-- 
    { 
        scanf関数(" %のD "、&OP)。
        もし(OP == 1)のscanf(" %dの%のD "、およびX&Y)のprintf(" %d個の\ n "、Qmaxと(30、Y、T [ID [X] - 1 ]、T [ID [X] + SIZ [X] - 1 ]))。
        のscanf(" %D%D%D "、およびX&Y、およびZ)のprintf(" %d個の\ n " 、Qmaxの(X、Y、Z))。
    } 
    戻り 0 
}
コードの表示

 

おすすめ

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