BZOJ3573 HNOI2014 公尺特運輸

2022-08-05 01:21:17 字數 2680 閱讀 3821

公尺特是d星球上一種非常神秘的物質,蘊含著巨大的能量。在以公尺特為主要能源的d星上,這種公尺特能源的運輸和儲存一直是乙個大問題。

d星上有n個城市,我們將其順序編號為1到n,1號城市為首都。這n個城市由n-1條單向高速通道連線起來,構成一棵以1號城市(首部)為根的樹,高速通道的方向由樹中的兒子指向父親。樹按深度分層:根結點深度為0,屬於第1層;根結點的子節點深度為1,屬於第2層;依此類推,深度為i的結點屬於第i+l層。

建好高速通道之後,d星人開始考慮如何具體地儲存和傳輸公尺特資源。由於發展程度不同,每個城市儲存公尺特的能力不盡相同,其中第i個城市建有乙個容量為a[i]的公尺特儲存器。這個公尺特儲存器除了具有儲存的功能,還具有自動收集公尺特的能力。

如果到了晚上六點,有某個儲存器處於未滿的狀態,它就會自動收集大氣中蘊含的公尺特能源,在早上六點之前就能收集滿;但是,只有在儲存器完全空的狀態下啟動自動收集程式才是安全的,未滿而又非空時啟動可能有安全隱患。

早上六點到七點間,根節點城市(1號城市)會將其儲存器裡的公尺特消耗殆盡。根節點不會自動蒐集公尺特,它只接受子節點傳輸來的公尺特。

早上七點,城市之間啟動公尺特傳輸過程,傳輸過程逐層遞進:先是第2層節點城市向第1層(根節點城市,即1號城市)傳輸,直到第1層的儲存器滿或第2層的儲存器全為空;然後是第3層向第2層傳輸,直到對於第2層的每個節點,其儲存器滿或其予節點(位於第3層)的儲存器全為空;依此類推,直到最後一層傳輸完成。傳輸過程一定會在晚上六點前完成。

由於技術原因,運輸方案需要滿足以下條件:

(1)不能讓某個儲存器到了晚上六點傳輸結束時還處於非空但又未滿的狀態,這個時候儲存器仍然會啟動自動收集公尺特的程式,而給已經儲存有公尺特的儲存器啟動收集程式可能導致危險,也就是說要讓儲存器到了晚上六點時要麼空要麼滿;

(2)關於首都——即1號城市的特殊情況, 每天早上六點到七點間1號城市中的公尺特儲存器裡的公尺特會自動被消耗殆盡,即運輸方案不需要考慮首都的公尺特怎麼運走;

(3)除了1號城市,每個節點必須在其子節點城市向它運輸公尺特之前將這座城市的公尺特儲存器中原本存有的公尺特全部運出去給父節點,不允許儲存器中殘存的公尺特與外來的公尺特發生混合;

(4)運向某乙個城市的若干個**的公尺特數量必須完全相同,不然,這些**不同的公尺特按不同比例混合之後可能發生危險。

現在d星人已經建立好高速通道,每個城市也有了一定儲存容量的公尺特儲存器。為了滿足上面的限制條件,可能需要重建一些城市中的公尺特儲存器。你可以,也只能,將某一座城市(包括首都)中屎來存在的公尺特儲存器摧毀,再新建一座任意容量的新的公尺特儲存器,其容量可以是小數(在輸入資料中,儲存器原始容量是正整數,但重建後可以是小數),不能是負數或零,使得需要被重建的公尺特儲存器的數目盡量少。

第一行是乙個正整數n,表示城市的數目。 接下來n行,每行乙個正整數,其中的第i行表示第i個城市原來存在的公尺特儲存器的容量。 再接下來是n-i行,每行兩個正整數a,b表示城市b到城市a有一條高速通道(a≠b)。

輸出檔案僅包含一行,乙個整數,表示最少的被重建(即修改儲存器容量)的公尺特儲存器的數目。

554

3211 2

1 32 4

2 5

樣例解釋

乙個最優解是將a[1]改成8,a[3]改成4,a[5]改成2。這樣,2和3運給1的量相等,4和5運給2的量相等,且每天晚上六點的時候,1,2滿,3,4,5空,滿足所有限制條件。

資料規模

對於100%的資料滿足\(,n<500000,a[j]<10^8\)

題面這麼長。。。

其實就是你要使得每個節點的子節點權值相等,並且該節點的權值=子節點個數*子節點權值。

如果暴力確定某乙個點不改變的話。。。複雜度是 o(n)的,一共n次,顯然不可接受。。。

事實上,是可以發現,某個節點權值不改變,同樣不需要改變的節點的權值是同乙個集合。。。

然後考慮如何找這個集合,顯然結果就是n-最大集合的元素個數。。。

顯然算出這個集合是相對比較容易的,考慮節點i的值與根節點的關係,顯然的,根節點的值應為\(vi*\pi sz [fa[i][j]]\),其中,sz表示某節點的子節點個數,fa表示某節點的若干個祖先,顯然累乘是可以邊遞迴邊得到的,因此只需要維護每個點一定時,根節點的權值即可,最後排序一下求出集合,統計答案。注意事項:顯然累乘是大到**的,高精度?不存在的。由於不需要輸出結果,可以取對數化乘為加。時間複雜度\(o(n \log n)\)

#include #include #include #define mn 500005

#define eps 1e-9

#define r register

#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);

#define end fclose(stdin);fclose(stdout)

inline int read()

int to[mn],nxt[mn],h[mn],v[mn],n,sz[mn],en,ans,sum; double f[mn];

inline void ins(int x,int y)

inline void dfs(int u,double p)

int main()

bzoj 3573 Hnoi2014 公尺特運輸

題目好難懂。簡述題意 給出一棵樹,要求滿足兩個要求 1.每個節點的子節點權值相等。2.每個節點的權值和是這個節點的權值。然後就出最小修改點的數量來滿足這個要求。那麼顯而易見只要確定乙個節點就可以確定群圖節點權值。這樣列舉是 通過這個結論我們發現只要確定1就可以確定全圖,所以可以通過讓每乙個節點權值不...

BZOJ 3573 Hnoi2014 公尺特運輸

bzoj 3573 hnoi2014 公尺特運輸 樹形dp hash 題意 給你一棵樹每個點有乙個權值,要求修改最少的權值,使得每個節點的權值等於其兒子的權值和且兒子的權值都相等。分析 首先我們發現在樹中如果確定乙個點的權值,那麼整顆樹的方案就能夠確定 問題轉化成求哪個方案包含的點最多 如何求包含這...

BZOJ3573 Hnoi2014 公尺特運輸

作者部落格 正解 排序 分析 解題報告 題目給出的各項約束條件,其實就是想告訴我們乙個這樣的模型 每個點的權值 父親節點的權值 父親節點的兒子節點個數,修改盡量少的點權使得滿足要求。然後可以發現,只要確定了乙個點填什麼,整棵樹的點權其實就唯一確定了 考慮兩個點 u v 令 dis x x走到根需要乘...