夏の試験2:履歴(永続互いに素セット)

トピック:

分析:

歴史を求めて2点間の接続かどうか - >互いに素セットは永続的かもしれません。

注:ツリーの社長の範囲からゼロ基準点がなければならない:0〜N-1

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define半ば((L + R)>> 1)
 の#define N 9000005
 INT ndnum = 0 、LC [N]、RC [N]、FA [N]、DEP [N]、ED [N]、N、M ;
ボイドビルド(INT S、INT L、INT R)
{ 
    場合(L == R)FA {[S]は、Lを=。返します} 
    ビルド(LC [S] = ++ ndnum、L、MID)。ビルド(RC [S] = ++ ndnum、中間+ 1 、R)。
} 
ボイド(変更INT S、int型の L、int型の R、int型POS)を
{ 
    場合(L == R){DEP [S] ++; 返します}
     であれば(POS <= MID)変更(LC [S]、L、中間、POS)。
    そうでなければ(RC [S]、ミッド+修正1 、R、POS)。
} 
int型の照会(INT S、INT L、のint R、int型のPOS)
{ 
    場合(L == R)リターンS。
    もし(POS <= MID)戻りクエリ(LC [S]、L、中間、POS)。
     戻りクエリ(RC [S]、ミッド+ 1 、R、POS)。
} 
無効マージ(int型最後、INT&RT、int型L、のint R、int型の POS、int型F)
{ 
    RT = ++ ndnum。LC [RT] = LCの[最終]。RC [RT] = RC [最終]。
    もし(L == R)FA {[RT] Fを=。[RT] DEP [最終] = DEP。返します}
     であれば(POS <= MID)マージ(LC LC [RT]、[最終]、L、中間、POS、F)。
    他のマージ(RC RC [RT]、[最終]、ミッド+ 1 、R、POS、F)。
} 
INT get_fa(INT S、int型のPOS)
{ 
    int型今=クエリ(S、0、N- 1 、POS)。
    もし(FA [今] == POS)リターン今。
    戻りget_faを(S、FA [今])。
} 
チャー OP [ 5 ]。
INT メイン()
{ 
    freopenは(" history.in "" R " 、STDIN)。
    freopenは(" history.out "" W " 、STDOUT)。
    int型 V、X、Y、C = 0、T、FL = 0 
    scanf関数(" %d個の%のD "、&​​N、&M)。
    ビルド(ED [ 0 ] = ++ ndnum、0、N- 1 )。
    int型 I =0 ;
     一方(M-- ){ 
        scanfの(" %のS " 、OP);
         IF(OP [ 0 ] == ' K ')scanfの(" %のD "、&​​V)、V = C、FL = 0 ; / / イタリアなお:いない怒り王を変更した後、
        IF(OP [ 0 ] == ' R&LT ' ){ 
            私は ++; ED [I] = ED [I- 1 ]; 
            scanfの(" %のDの%のD "、 X&、&Y)、
             IF(FL)X =(X + C)%N-、Y =(Y + C)%のn-。
            INT F1 = get_fa(ED [I]、X)、F2 = get_fa(ED [i]は、Y);
            もし(FA [F1] == FA [F2])続けますもし(DEP [F1]> DEP [F2])スワップ(F1、F2)。
            マージ(ED [I - 1 ]、ED [i]は、0、N- 1 、FA [F1]、FA [F2])。
            もし(DEP [F1] == DEP [F2])を変更(ED [i]は、0、N- 1 、FA [F2])。
        } 
        もし(OP [ 0 ] == ' T ' ){ 
            scanf関数(" %D%D%D "、およびX&Y、&T)。
            int型F1 = get_fa(ED [MAX(0、IT)]、X)、F2 = get_fa(ED [MAX(0、それ)]、Y);
            INT F3 = get_fa(ED [I]、X)、F4 = get_fa(ED [i]は、Y);
            もし(!FA [F1] = FA [F2] && FA [F3] == FA [F4])のprintf(" Y \ N ")、FL = 0 ;
            のprintf(" Nの\ n ")、FL = 1 
        } 
    } 
    戻り 0 
} 
/ * 
3 7 
R 0 1 
T 0 1 1 
K 1 
R 0 1 
T 0 1 1 
R 0 1 
T 0 2 1 
* /

 

おすすめ

転載: www.cnblogs.com/mowanying/p/11402204.html