BZOJ 1099 樹網的核

2022-05-12 11:14:52 字數 1339 閱讀 5308

題面

搞了三個多小時。。。。

noip時的資料很水,直接暴力n^3過。

我們考慮優化,首先可以貪心,我們要在直徑上選肯定越插長越好,所以n^2其實就可以解決。但這還不夠,根據直徑的最長性,我們可以用乙個單調佇列優化。

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 500005;

const

int inf = 0x7fffffff;

inline

int rd()

while(isdigit(ch))

return x*f;

}int n,s,num,a[maxn],father[maxn];

int head[maxn],cnt,d,top[maxn],d[maxn];

int to[maxn<<1],nxt[maxn<<1],val[maxn<<1];

int ans=inf,dis[maxn],diameter,mx,st,last;

bool vis[maxn];

inline

void add(int bg,int ed,int v)

inline

void dfs1(int x,int fa)

dfs1(u,x);

}}inline

void dfs2(int x,int fa)

dfs2(u,x);

}}inline

void dfs4(int rt,int x,int dis)

}int main()

dfs1(1,0);

for(register

int i=1;i<=n;i++) dis[i]=0;

dfs2(st,0);

// coutmx=0;

for(register

int i=last;i;i=father[i])

// for(register int i=1;i<=num;i++) coutint i=1;i<=num;i++) dfs4(top[i],top[i],0),mx=max(mx,d[top[i]]);

// for(register int i=1;i<=num;i++) coutint l=1;

for(register

int i=1;i<=num;i++)

printf("%d",ans);

return

0;}

BZOJ 1099 樹網的核

題面 搞了三個多小時。noip時的資料很水,直接暴力n 3過。我們考慮優化,首先可以貪心,我們要在直徑上選肯定越插長越好,所以n 2其實就可以解決。但這還不夠,根據直徑的最長性,我們可以用乙個單調佇列優化。include include include include include using n...

luogu P1099 樹網的核

題面傳送門 先兩遍dfs dfsdf s跑出樹的直徑。因為所有樹的直徑都是相類似的,所以只要跑一條直徑就好了。然後在這條直徑上尺取。最後對於直徑上每個點的子樹不經過直徑上的邊求距離取最大值即可,這一步很難想,因為如果不取最大值那麼就會漏掉答案因為無論如何都是要有這條邊的權值的。完美o n o n o...

P1099 樹網的核

這裡是o n 2 的做法 首先可以證明,對於每一條直徑,求出的偏心距是一樣的 怎麼證明?顯然 我不會 怎樣求樹的直徑?簡單。貪心 在一條直徑上,顯然選擇的路徑越長越好 實現 首先求出樹上所有點之間的距離 n 2 一直dfs就行 然後找出直徑及直徑經過的點 最後在直徑上貪心的取即可 include i...