Л Гу P4374

Является ли проблема платы.

Обратите внимание, что правая сторона точки поворота, чтобы удалить правую LCA, непосредственно ID [х] изменен, чтобы добавить.

Обратите внимание, что в это время, если х == у, непосредственно возвращается.

Код выглядит следующим образом:

# include <бит / STDC ++ ч.>
 с использованием  пространства имен STD;
#define инф 2147483647
 Const  INT maxn = 1E6;
INT п, м; 
рядный INT чтения () {
     INT х = 0 , е = 1 ;
    символ с = GetChar ();
    в то время как (с < ' 0 ' || с> ' 9 ' ) {
         если (с == ' - ' ) F = - 1 ; 
        с = GetChar (); 
    } в 
    то время как(с> = ' 0 ' && с <= ' 9 ' ) { 
        х = (х << 1 ) + (х << 3 ) + с- ' 0 ' ; 
        с = GetChar (); 
    } 
    Вернуться х * п; 
} 
INT бек [maxn], NEX [maxn], чтобы [maxn], е; 
рядный недействительными добавить ( INT х, INT у) { 
    е ++; NEX [е] = бек [х]; 
    бек [х] = е; в [е] = у; 
} 
INT хх [maxn], уу [maxn];
ИНТсын [maxn], размер [maxn], отд [maxn], фа [maxn]; 
рядный недействительными dfs1 ( INT х, INT ANC) { 
    отд [х] = DEP [ANC] + 1 ; 
    фа [х] = КСД; 
    Размер [х] = 1 ;
    для ( INT I = бек [х]; я; I = NEX [I]) {
         INT т = к [I];
        если (т == ANC) продолжить ; 
        dfs1 (т, х); 
        Размер [х] + = размер [т];
        если (размер [т]> размер [сын [х]]) 
            сын [х] = т;
    } 
} 
INT ID [maxn], сверху [maxn], CNT; 
рядный недействительными dfs2 ( INT х, INT ГЭНПСК) { 
    идентификатор [х] = ++ CNT; 
    сверху [х] = ГЭНПСК;
    если (сын [х]!) возвращение ; 
    dfs2 (сын [х], ГЭНПСК); 
    для ( INT I = бек [х]; я; I = NEX [I]) {
         INT т = к [I];
        если (т == фа [х] || т == сын [х])
             продолжить ; 
        dfs2 (т, т); 
    } 
} 
INT TR [maxn], ленивый [maxn]; 
в соответствиинедействительныйPushup ( INT ч, INT г) { 
    тр [ч] = мин (тр [ч], г); 
    ленивый [ч] = мин (ленивая [ч], г); 
} 
Инлайн недействительными магазинного ( INT ч) {
     если (ленивая [ч] == инф) возвращение ; 
    Pushup (ч << 1 , ленивая [ч]); 
    Pushup (ч << 1 | 1 , ленивая [ч]); 
    ленивая [ч] = инф; 
} 
Инлайн недействительными Modify ( INT ч, INT л, INT г, INTх, INT у, INT г) {
     если (л> у || г <х) возврат ;
    если (л> = х && г <= у) { 
        Pushup (ч, г); 
        вернуться ; 
    } 
    Магазинный (ч); 
    INT середины = (L + R) >> 1 ; 
    Modify (ч << 1 , л, в середине, х, у, г); 
    изменить (ч << 1 | 1 , середина + 1 , г, х, у, г);
    // тр [ч] = мин (тр [ч << 1], тр [ч << 1 | 1]); 
} 
Инлайн недействительными тс ( INT х, INT у, INT г) {
     в то время(! сверху [х] = сверху [у]) {
         если (DEP [наверх [х]] < DEP [наверх [у]]) подкачки (х, у); 
        изменить ( 1 , 1 , п, идентификатор [сверху [х]], идентификатор [х], г); 
        х = фа [вершина [х]]; 
    } 
    Если (х == у) возвращение ;
    если (DEP [х]> DEP [у]) подкачки (х, у); 
    изменить ( 1 , 1 , п, идентификатор [х] + 1 , ID [у], г); 
} 
/ * 
Инлайн недействительных сборок (интермедиат ч, Int л, Int г) { 
    тр [ч] = ленивая [ч] = инф; 
    если (л г ==) возвращение; 
    INT середины = (L + R) >> 1; 
    сборки (ч << 1, л, середина); 
    билд (ч << 1 | 1, середина + 1, г);
} 
* / 
РядныйINT запроса ( INT ч, INT л, INT г, INT х) {
     если (л == г) возвращение тр [ч];
    INT середины = (L + R) >> 1 ; 
    магазинный (ч); 
    если (середина> = х) возврат запроса (ч << 1 , л, в середине, х);
    еще  обратный запрос (ч << 1 | 1 , середина + 1 , г, х); 
} 
INT основных () {
     // freopen ( "p.in", "г", стандартный ввод); 
    п = следующим образом (), т = следующим образом ();
    для ( INT I = 0; я <= 10 * п; я ++ ) 
        тр [I] = ленивым [I] = инф;
    для ( Int I = 1 ; я <п; я ++ ) { 
        хх [г] = следующим образом (); 
        уу [I] = следующим образом (); 
        добавить (XX [I], уу [I]); 
        добавить (YY [I], хх [I]); 
    } 
    Dfs1 ( 1 , 0 ); 
    dfs2 ( 1 , 1 );
    // сборки (1,1, п); 
    INT х, у, г;
    для ( Int I = 1 ; I <= т; я ++ ) { 
        х= чтения (), Y = следующим образом (), г = следующим образом (); 
        тс (х, у, г); 
    } 
    INT АС = 0 , WA = 0 ;
    для ( Int I = 1 ; я <п; я ++ ) {
         если (DEP [XX [I]] < DEP [уу [I]]) подкачки (XX [I], YY [I]);
        INT TMP = запроса ( 1 , 1 , п, идентификатор [хх [I]]); 
        TMP = (TMP == инф) - 1 : TMP; 
        Е ( " % d \ п " , TMP);
        / * Х = чтения (); 
        если (х == TMP) AC ++; 
        остальное WA ++ Е ( "% d% d \ п", х, TMP);
        // Е ( "% d \ п", TMP == инф -1: TMP); 
        * / 
    } 
    // Е ( "% d% d \ п", АС, WA); 
    вернуться  0 ; 
}

 

рекомендация

отwww.cnblogs.com/syzf2222/p/12386730.html
рекомендация