NOI2013 快餐店 環套樹 線段樹

2022-05-03 19:03:10 字數 2239 閱讀 2787

題目大意:給你一顆環套樹,你要在這棵的邊上(包括端點)找乙個點,使得離該點最遠的點最近。

資料範圍:$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 條雙向道路連線起來,不存在任何兩條道路連線了相同的兩個建築...