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...