UCFローカルプログラミングコンテスト2018 Eタイトル(フェンウィックツリー+ DFS順)

この質問は制限されていない場合、それはツリー状の配列+ DFS裸のタイトルシーケンスであります

最初の要求は、それが動的にツリーを変更する場合、維持することが困難で、配列が確かに変わりDFS、及びデータが大きい場合、暴力がTであるべきで、その後、動的寄与を所望その結果、混乱するかもしれません

したがって、すべてのノードは、DFS配列一旦、最初の操作のために必要なように、最初に完了したいです

私達はちょうど彼の前に、その位置マイナス和bouns DFS順序を必要とし、+の後にこれに戻ってくる位置に、そのように修飾することが、この点があり、かつ操作の要件と同等の新しいポイントとなりました

#include <iostreamの> 
する#include <cstdioを> 
する#include <cmath> 
の#include <アルゴリズム> 
の#include < ストリング > 
の#include <CStringの> 
する#include <マップ> 
の#include < セット >
 使用して 名前空間STDを、
typedefの長い 長いLL。
CONST  INT N = 1E6 + 10 const  int型 INF = 0x3f3f3f3f 
LL TR [N]。
LL MUL [N]。
LL bouns [N]。
INT IDX;
int型の時間。
int型H [N]、E [N]、NE [N]、CNT = 1 構造体ノード{
     INT タイプ;
    int型のID。
    int型V; 
} Q [N]。
構造体Q {
     INT ST。
    int型のED。
} POS [N]。
ボイド追加(int型int型B){ 
    E [IDX] = B、NE [IDX] = H [A]、H [A] = IDX ++ 
} 
ボイド DFS(INT U){ 
    POS [U] .ST = ++ 回;
    int型私は、
     - ;(!i = iはH [U] = 1 ; iが= {NE [i])と
         INTをJ = E [i]は、
        DFS(J)。
    } 
    POS [U] .ED = 時間; 
} 
INT lowbit(INT X){
     リターン X& - X。
} 
ボイド ADD1(INT X、LL C){
     int型のI。
    (; I <= CNT; I + = I = X lowbit(I)){ 
        TR [I] + = C。
    } 
} 
(SUM llの整数X){
     int型のI。
    LL RES = 0 以下のための(I = X; I; I- = lowbit(I)){ 
        RES + =  TR [I]。
    }
    リターンのres; 
} 
int型のmain(){
     int型I。
    INT M、S。
    CIN >> M >> S。
    memsetの(H、 - 1はsizeof H)。
    以下のための式(I = 1 ; I <= M; I ++ ){ 
        scanf関数(" %のD "、&Q [I] .TYPE)。
        scanf関数(" %のD "、&Q [I] .ID)。
        もし(Q [i]が.TYPE == 1 ){ 
            CNT ++ 
            (Q [i]が.ID、CNT)を加えます。
            Q [i]は.V =CNT; 
        } 
        そう であれば(Q [i]が.TYPE == 2 || Q [i]は.TYPE == 3 ){ 
            scanf関数(" %のD "、&Q [I] .V)。
        } 
    } 
    のためには、(iは= 1 ; I <= CNT; I ++ 
        MUL [I] = S。
    DFS(1 )。
    以下のために(iは= 1 ; iが<= M; I ++ ){
         場合(Q [i]が.TYPE == 1 ){ 
            LL TMP = SUM(POS [Q [I] .V] .ST)。
            ADD1(POS [Q [I] .V] .ST、 - TMP)。
            ADD1(POS [Q [I] .V] .ST + 1 、TMP)。
        } 
        そう であれば(Q [i]が.TYPE == 2 ){ 
            LL TMP = SUM(POS [Q [i]は.ID] .ST)。
            bouns [Q [I] .ID] + = TMP * MUL [Q [i]は.ID]。
            MUL [Q [i]は.ID] = (LL)Q [I] .V。
            ADD1(POS [Q [i]は.ID] .ST、 - TMP)。
            ADD1(POS [Q [i]は.ID] .ST + 1 、TMP)。
        } 
        そう であれば(Q [i]が.TYPE == 3 ){
             int型 place1 = POS [Q [i]は.ID] .ST。
            int型 place2 =POS [Q [i]は.ID] .ED。
            ADD1(place1、Q [i]は.V)。
            ADD1(place2 + 1、 - Q [I] .V)。
        } 
        { 
           のprintf(" %のLLD \ n "、bouns [Q [I] .ID] + SUM(POS [Q [i]は.ID] .ST)* MUL [Q [I] .ID])。
        } 
    } 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/ctyakwf/p/12571191.html
おすすめ