C 樹上的最遠點對

2021-10-05 17:11:49 字數 2944 閱讀 1709

51nod-1766

vjudge

n個點被n-1條邊連線成了一顆樹,給出 a~b 和 c~d 兩個區間,表示點的標號請你求出兩個區間內各選一點之間的最大距離,即你需要求出max{dis(i,j) |a<=i<=b,c<=j<=d}

(ps 建議使用讀入優化)

第一行乙個數字 n n<=100000。 第二行到第n行每行三個數字描述路的情況,x,y,z (1<=x,y<=n,1<=z<=10000)表示x和y之間有一條長度為z的路。 第n+1行乙個數字m,表示詢問次數 m<=100000。 接下來m行,每行四個數a,b,c,d。

共m行,表示每次詢問的最遠距離

5

1 2 1

2 3 2

1 4 3

4 5 4

12 3 4 5

10
線段樹+lca

給你兩個區間,問各從乙個區間選擇乙個點,兩個點之間的最長路是多少,這裡需要注意就是如果第乙個區間是a和b最遠,第二個區間是c和d最遠,那麼答案一定是ab,cd,ac,ad,bc,bd,其中乙個,於是我們只要用線段樹維護合併,外加lca求兩個點的距離即可。

#pragma gcc optimize(3,"ofast","inline")

#pragma g++ optimize(3,"ofast","inline")

#include

#include

#include

#include

#include

#define ri register int

#define re(i,a,b) for(ri i=a; i<=b; i++)

#define ms(i,a) memset(a,i,sizeof(a))

#define max(a,b) (((a)>(b)) ? (a):(b))

#define min(a,b) (((a)<(b)) ? (a):(b))

using

namespace std;

typedef

long

long ll;

namespace io

template

<

typename t>

inline

void

write

(t x)

template

<

typename t>

inline

void

writesp

(t x)

template

<

typename t>

inline

void

writeln

(t x)

}using io::read;

using io::write;

using io::writesp;

using io::writeln;

const

int n=

1e5+5;

const

int inf=

1e9;

struct edge e[n<<1]

;struct ans t[n<<2]

;int n,m,cnt,sum;

int h[n]

,dep[n]

,f[n][20

],tin[n]

,tout[n]

;inline

void

add(

int a,

int b,

int c)

; h[a]

=cnt++;}

void

dfs(

int x,

int fa,

int d)

tout[x]

=++sum;

}inline

intancestor

(int x,

int y)

inline

intlca

(int x,

int y)

inline

intdist

(int x,

int y)

#define lch (o<<1)

#define rch (o<<1|1)

#define mid ((l+r)>>1)

void

pushup

(int o)}}

void

build

(int o,

int l,

int r)

build

(lch,l,mid)

;build

(rch,mid+

1,r)

;pushup

(o);

}ans query

(int o,

int l,

int r,

int ll,

int rr)

}return ta;}}

intmain()

dfs(1,

1,0)

;for

(int j=

1; j<=

16; j++

)for

(int i=

1; i<=n; i++

) f[i]

[j]=f[f[i]

[j-1]]

[j-1];

build(1

,1,n);

read

(m);

while

(m--

)writeln

(ans);}

return0;

}

樹上直徑 樹上最遠點O n

題目大意 對於一棵n個結點的無根樹,求出每個結點的最遠點,要求時間複雜度為o n 對於乙個點,距離它最遠的點一定是直徑的端點。證明 我們求直徑的時候,兩次dfs。兩次bfs 或者dfs 方法 先從任意一點p出發,找離它最遠的點q,再從點q出發,找離它最遠的點w,w到q的距離就是是的直徑 若p已經在直...

51NOD 1766 樹上的最遠點對

n 個點被n 1條邊連線成了一顆樹,邊有權值wi 有q 個詢問,給出 a b 和 c,d 兩個區間,表示點的標號請你求出兩個區間內各選一點之間的最大距離,即你需要求出 ma x 1 n,q 105,1 wi 104 可以發現最長路徑具有直徑的合併性質,即兩個區間選點的最長路徑端點一定是原本兩個區間最...

51nod1766 樹上的最遠點對

n個點被n 1條邊連線成了一顆樹,給出a b和c d兩個區間,表示點的標號請你求出兩個區間內各選一點之間的最大距離,即你需要求出max dis i,j a i b,c j d ps 建議使用讀入優化 第一行乙個數字 n n 100000。第二行到第n行每行三個數字描述路的情況,x,y,z 1 x,y...