清華集訓2016 汽水

2022-04-30 19:27:12 字數 2178 閱讀 8715

試題描述:

牛牛來到了乙個盛產汽水的國度旅行。

這個國度的地圖上有n個城市,這些城市之間用 n−1 條道路連線,任意兩個城市之間,都存在一條路徑連線。這些城市生產的汽水有許多不同的風味,在經過道路 i 時,牛牛會喝掉 wi 的汽水。牛牛非常喜歡喝汽水,但過量地用汽水是有害健康的,因此,他希望在他旅行的這段時間內,平均每天喝到的汽水的量盡可能地接近給定的乙個正整數 k。

同時,牛牛希望他的旅行計畫盡可能地有趣,牛牛會先選擇乙個城市作為起點,然後每天通過一條道路,前往乙個沒有去過的城市,最終選擇在某乙個城市結束旅行。

牛牛還要忙著去喝可樂,他希望你幫他設計出乙個旅行計畫,滿足每天 |平均每天喝到的汽水−k|的值盡量小,請你告訴他這個最小值。

第一行兩個正整數 n,k。

接下來 n−1

行,每行三個正整數 ui,vi,wi,表示城市 ui 和城市 vi 之間有一條長度為 wi

的道路連線。

同一行相鄰的兩個整數均用乙個空格隔開。

一行乙個整數,表示 |平均每天喝到的汽水−k| 的最小值的整數部分,即你只要將這個最小值向下取整然後輸出即可。

5 21

1 2 9

1 3 27

1 4 3

1 5 12

1
簡單的分數規劃&點分治

不知道為什麼考場上寫的常數那麼大,考完了又寫了一遍跑得飛快(霧

看到最小化平均值,就應該嘗試一下分數規劃,也就是二分答案的做法

而因為要大規模處理鏈上的內容,應該要想到點分治

考慮這題怎麼做

讀入長度的時候先把所有長度減去k,這樣最後求出來的一條鏈的長度的平均數就是答案

設點分治時候一棵子樹的某一條鏈的有這樣兩個資訊(a,b)

a表示該點到點分治的根的真實距離

b表示該點到點分治的根的深度

二分mid時,合併兩條鏈(a1,b1) (a2,b2)有:

\[-mid < \frac < mid

\]因為要取整的原因這裡用<,到後面輸出答案直接減一即可

因為b1+b2始終大於零 所以考慮只a1+a2。

a1+a2>0時有 $$a1-b1mid < b2mid-a2$$ 發現對a排序之後可以單調維護後面一坨的最大或最小值

小於0同理,於是這題就oo了

複雜度:$$o(n\log n\log v)$$

#include#define ll long long

#define r register

#define inf_int 2003060400

#define inf_ll 1000000000000000000

using namespace std;

namespace io

while(isdigit(ch))

x = f?-x:x;

} templatet max(t a, t b)

templatet min(t a, t b)

else if(fg*b >= fg*b.b && nod.anc != a.anc) b = nod, b.b = b;

return 0;

} bool check1(ll x)

if(update(len[i], len[i].b*x-len[i].a, mx, mx1, 1, 0)) return 1;

} return 0;

} bool check2(ll x)

if(update(len[i], -len[i].a-len[i].b*x, mn, mn1, -1, 0)) return 1;

} return 0;

} void run(int x)

ans = min(ans, l); }}

void findrt(int x, int fa)

maxson = max(maxson, s-siz[x]);

if(maxson < max) max = maxson, root = x;

}void run(int x)

}void init()

s = n, max = inf_int;

findrt(1, 0);

run(root);

printf("%lld\n", ans-1);

}int main()

UOJ276 清華集訓2016 汽水

link 先點分治,儲存下以當前重心為一端且不經過其它中重心的路徑,並按 overline w k 排序。然後二分答案,用雙指標掃每個重心的路徑,並維護下 overline w k 最小的路徑。注意不能選來自同一子樹的兩條路徑,因此我們再維護乙個與 overline w k 最小的路徑來自不同子樹的...

Luogu6670 清華集訓2016 汽水

luogu6670 清華集訓2016 汽水 網上說這道題是點分治?反正蒟蒻用邊分治切了這道題。題意就是求一條鏈,使它的平均權值與 k 的絕對值最小。設任意一條鏈為 求 min lvert frac t w i k rvert 我們考慮二分答案,然後我們需要判斷是否存在符合條件的鏈。我們二分的是 lv...

P6670 清華集訓2016 汽水

p6670 清華集訓2016 汽水 給一棵樹,邊有邊權,要求找到一條路徑使得其平均值和 k 最接近。首先樹上路徑容易想到點分治。然後發現這可以套乙個 0 1 分數規劃,於是我們可以把所有的邊權減掉 k 再二分 mid 現在的問題就是判斷了。我們發現答案具有單調性,於是我們可以排序過後雙指標維護路徑。...