羅区P4281問題へ[AHOI2008]緊急回収ソリューション

非常に良い質問は、それ自体は難しくありませんが、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(10 );
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 }
論文をギャングしてください(とにかく、私はそれが論文を何を意味するのか知りません)

 

おすすめ

転載: www.cnblogs.com/handsome-zyc/p/11237610.html