題目大意:給你一顆環套樹,你要在這棵的邊上(包括端點)找乙個點,使得離該點最遠的點最近。
資料範圍:$n≤10^5$,邊權$≤10^9$。
此題不難看出一種暴力做法,我們依次斷開環上的一條邊,然後求整顆樹的直徑,取個$min$就好了,時間複雜度是$o(n^2)$的。
然而顯然會$t$,我們考慮一些優秀的做法,我們首先將環拆成鏈,將鏈倍長(通用套路),然後將環上的點重新編號一下,設環上點的個數為$m$。
如果我們去掉了這個環,原圖會變成森林,對於森林中的每一棵樹,我們都先求一下它的直徑。
令$d_i$表示以環上第$i$個點為根的子樹內,與$i$號點距離最大的點與$i$號點間的距離。
令$s_i$表示環上第$i$個點距離環上第乙個點的距離(此處的i可以從$1$取到$2m$)。
那麼,對於環上兩點$(i,j)$,由$i$為根子樹,$j$為根子樹,還有i至j的鏈構成的樹的直徑為$d_i+d_j-s_i+s_j$。
移項後有$(d_i-s_i)+(d_j+s_j)$。
我們用線段樹維護這個東西就可以了,(我的線段樹寫得有點挫,應該有更高效的編碼方法)
1 #include2#define m 200005
3#define l long long
4#define inf (1ll<<60)
5#define mid ((a[x].l+a[x].r)/2)
6using
namespace
std;78
struct edgee[m*2]=; l head[m]=,use=0;9
void add(l x,l y,l z)
1011
struct nodea[m<<2]=;
12void
build(l x,l l,l r)
16void
upd(l x,l k)
20void
upd2(l x,l k)
24void
pushdown(l x)
28void
pushup(l x)
33void
updata(l x,l l,l r,l k)
40void
updata(l x,l k,l val)
42pushdown(x);
43if(k<=mid) updata(x<<1
,k,val);
44else updata(x<<1|1
,k,val);
45pushup(x);46}
47void
updata2(l x,l l,l r,l k)
54void
updata2(l x,l k,l val)
56pushdown(x);
57if(k<=mid) updata2(x<<1
,k,val);
58else updata2(x<<1|1
,k,val);
59pushup(x);60}
6162 l cir[m]=,vis[m]=,n,m=0; stackst;
63bool
getcir(l x,l fa)
68 cir[++m]=x;
69return1;
70}71 st.push(x); vis[x]=1;72
for(l i=head[x];i;i=e[i].next) if(e[i].u!=fa)
75st.pop();
76return0;
77}7879
void
init()85}
8687 l d[m]=,s[m]=,ans=0;88
l dfs(l x,l fa)
95 ans=max(ans,max1+max2);
96return
max1;97}
98void
getmax()
109 ans=max(ans,max1+max2);
110 d[x]=max1;
111}
112113
for(l x=1;x<=2*m;x++)
118}
119120
void
work()
128for(l i=1;i<=m;i++)
139 ans=max(ans,minn);
140}
141142
main()
動態規劃 NOI2013 快餐店
第一行包含乙個整數n,表示城市c中的建築和道路數目。接下來n行,每行3個整數,ai,bi,li 1 i n li 0 表示一條道路連線了建築ai與bi,其長度為li 僅包含乙個實數,四捨五入保留恰好一位小數,表示最佳快餐店選址距離最遠使用者的距離。注意 你的結果必須恰好有一位小數,小數字數不正確不得...
樹DP 基環樹 NOI2013 快餐店
小 t 打算在城市 c 開設一家外送快餐店。送餐到某乙個地點的時間與外賣店到該地點之間最短路徑長度是成正比的,小 t 希望快餐店的位址選在離最遠的顧客距離最近的地方。快餐店的顧客分布在城市 c 的 n 個建築中,這 n個建築通過恰好 n 條雙向道路連線起來,不存在任何兩條道路連線了相同的兩個建築。任...
Bzoj 3242 快餐店 環套樹
description 小t打算在城市c開設一家外送快餐店。送餐到某乙個地點的時間與外賣店到該地點之間最短路徑長度是成正比的,小t希望快餐店的位址選在離最遠的顧客距離最近的地方。快餐店的顧客分布在城市c的n 個建築中,這n 個建築通過恰好n 條雙向道路連線起來,不存在任何兩條道路連線了相同的兩個建築...