試題描述:
牛牛來到了乙個盛產汽水的國度旅行。
這個國度的地圖上有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 現在的問題就是判斷了。我們發現答案具有單調性,於是我們可以排序過後雙指標維護路徑。...