非常に良い質問は、それ自体は難しくありませんが、2点LCAを置くことを求めていることの三点二十から二LCAを求めるを求めなり、ポイントが最適解である一致していません。答えの最後の思考は、差分処理を使用していることを言及する価値がある:、別のポイントを2つの少し深さd1と仮定する
深さd2は、それらは、深さd3をLCA、これら二つの間の距離があれば3点、これらの二つの点を促進することができるように、D1 + D1-2 * D3となります。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5 の#define MAXN 500000 6 使って 名前空間STD。 7インラインint型リード() 8 { 9 整数 X = 0 。 10 ブール F = 1 。 11 チャー C = GETCHAR()。 12 のために(!; isdigit(C); C = GETCHAR())場合(C == ' - ')、F = 0 。 13 のために(; isdigit(C); C = GETCHAR())x =(x << 3)+(X << 1)+ C- ' 0 ' 。 14 であれば(F) 、リターンX。 15 リターン 0 - X。 16 } 17 int型N、M。 18の 長い 長いANS。 19 INT F [MAXN + 10 ] [ 25 ]、DEP [MAXN + 10 ]、T。 20 構造体ノード 21 { 22 INT から、NEX、であり; 23 }エッジ[2 * MAXN + 10 ]。 24 int型のヘッド[ 2 * MAXN + 10 ]、TOT = 0 。 25インラインボイド追加(int型のx、int型のY) 26 { 27 エッジ[++ TOT]。=のX。 28 エッジ【TOT] .TO = Y。 29 エッジ【TOT] .nex = 頭部[X]。 30 頭[X] = TOT。 31 } 32インラインボイド Deal_first(INT U、INT 父) 33 { 34 DEP [U] = DEP [父] + 1 。 35 のためには、(int型 i = 0 ; iは<= 19 ; I ++ ) 36 { 37 F [U] [I + 1 ] = F [F [U] [I] [I]。 38 } 39 のための(int型、E =ヘッド[U]; E; E = エッジ[E] .nex) 40 { 41 のint V = エッジ[E] .TO。 42 場合(V ==父親)が継続。 43 F [v] [ 0 ] = U。 44 Deal_first(V、U); 45 } 46 } 47インラインINT LCA(int型のx、int型のY) 48 { 49 であれば(DEP [X] < DEP [Y])スワップ(X、Y) 50 のために(int型私は= 20、I> = 0 ; i-- ) 51 { 52 であれば、X =(> = DEP [Y] [X] [I] F] DEP)F [x]は[I]。 53 であれば(x == y)は戻りX。 54 } 55 のために(int型 iは= 20、I> =0 ; i-- ) 56 { 57 であれば([X] [I] = F!F [Y] [I]) 58 { 59 、X = F [X] [I]。 60 、Y = F [Y] [I]。 61 } 62 } 63 リターン F [X] [ 0 ]。 64 } 65 のint main()の 66 { 67は、 N =(読み取り); M = (読み取り) 68 のためには、(int型 = Iを1 ; I <= N- 1、I ++ ) 69 { 70 int型、B; 71 = read()は、B = 読み取ります()。 72 (B)を追加;(B、A)を加えます。 73 } 74 Deal_first(1、0 ); 75 のために(int型 I = 1 ; I <= M Iは++ ) 76 { 77件 のANS = 0 。 78 int型A、B、C。 79 = READ(); B =読み取る(); C = 読み取ります()。 80 int型の T1 = LCA(B) 81 int型 T2 = LCA(C); 82 int型 T3 =LCA(B、C)。 83 であれば(T1 == T2)T = T3。 84 他の 場合(T1 == T3)T = T2。 85 他の 場合(T2 == T3)T = T1。 86 のANS =のDEP [A] + DEP [B] + DEP [C] -dep [T1] -dep [T2] - DEP [T3]。 87 のprintf(" %D%LLD \ n " 、T、ANS)。 88 } 89 リターン 0 。 90 }
論文をギャングしてください(とにかく、私はそれが論文を何を意味するのか知りません)