poj3417

poj3417の
LCA +差動
それぞれが新しいエッジに加えて、新しいエッジがリングに上書きされていること、それを覆うサイドカバー再び破断新しいエッジは、2つの部分木に分割することができる以外は、環を形成します。エッジのために屋根付きの1より大きい倍の数である、あなたは答えのオフ少なくとも二つの新しいエッジが寄与できなくなります持っています。カバーされていないために、1をカバーし、回答側のための新たな貢献の数は、寄与度は1で、それ以外の場合はその後、0。
ルート文は文献のためにD [x]は、時間エッジの親ノードにノードxの部分が覆われているの数を表します。

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <キュー> 
の#include <アルゴリズム> 
書式#include <cmath> 
の#include <ctimeの> 
の#include < セット > 
の#include <マップ> 
書式#include <スタック> 
の#include <CStringの>
 #define INF 2147483647回
 の#defineのLS RT << 1つ
 の#defineのRS RT << 1 | 1
 の#define LSON LSと、NL、中間、L、R用
 の#define rson Rsと、中間+ 1、NR、L、R用
 の#define N 100010
 #defineについて(iは、B)(iは=にint; iが= Bを<。
I ++) の#define P(A)のputchar(A)
#define G()GETCHAR()使用して、名前空間STDを、INTのN、M、X、Y、ANS。
INT S、F [N] [ 21 ]、深い[N]。
INT D [N]。構造体ノード{
     int型のn; 
    ノード * 次の; 
} * E [N]。無効INTX){
     int型、Y = 1 チャー C = G(); X = 0 一方、(C < ' 0 ' || C> ' 9 ' ){
         もし

 





 (C == ' - ')Y = - 1 
        C = G(); 
    } 
    一方、(C <= ' 9 ' && C> = ' 0 ' ){ 
        X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = G(); 
    } 
    、X * = Y。
} 
ボイド O(INT X){
     場合(X < 0 ){ 
        P(' - ' )。
        X = - X。
    } 
    場合(X> 9)O(X / 10 )。
    P(Xの10 + ' 0 ' )。
} 

ボイドプッシュ(int型のx、int型のY){ 
    ノード *のP。
    P = 新しいノード()。
    P - > N = Y。
    もし(E [X] == 0 
        E [X] = Pと、
    { 
        P - >次= E [X] - > 次。
        E [X] - >次= P。
    } 
} 

のボイドビルド(int型{今)
    深い[今] =深い[F [今] [ 0 ] + 1 以下のためにint型 I = 1、(1 << I)<=深い[今]; iは++ 
        F [今] [I] = F [F [今] [I- 1 ]] [I- 1 ]。
    ため(ノード* I = E [今]; I; I = I-> 次){
         場合(!I-> N = F [今] [ 0 ]){ 
            F [I - > N] [ 0 ] = 今; 
            構築(I - > N); 
        } 
    } 
} 

int型 LCA(INTX、int型のY){
     場合(深い[X] < 深い[Y])
        スワップ(X、Y)
    INT C =深い[X] - ディープ[Y]。
    (私用0 、LOG2(c)参照)
         場合((1 << I)&C)
            X = F [X] [I]。
    もし(x == y)は
         戻りX。
    以下のためにint型 I =のLOG2(深い[X]); iは> = 0 ; i-- であれば(![X] [I] = F {F [Y] [i])と
            、X = F [x]は[I ]; 
            Y = F [Y] [I]。
        }
    戻り [X] [F 0 ]。
} 

INT DFS(int型のx、int型FA){
     ため(ノード* I = E [X]; I; I = I-> 次)
         であれば(I-> N =!FA)
            D [X] + = DFS(I - > N、X)。
    戻りD [X]。
} 

int型のmain(){
     (N)(M)。
    (Iについて1、N- 1 ){
         、(X)(Y)
        プッシュ(X、Y)
        プッシュ(Y、X)。
    } 
    F [ 1 ] [ 0] = 1 
    (ビルド1 )。
    (Iについて1 、M){
         (X)(Y)
        D [X] + = 1 ; D [Y] + = 1 ; 
        D [LCA(X、Y)] - = 2 
    } 
    D [ 1 ] = DFS(11 )。
    (Iについて1 、n)の
         場合(D [i]は&& I =!1 
            ANS + = M。
        それ以外の場合(D [i]を== 1 
                ANS ++
            ; 
    O(年); 
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/war1111/p/11237201.html