HNOI2014 公尺特運輸

2022-04-28 17:36:08 字數 2543 閱讀 1358

公尺特是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號城市的特殊情況, 每天早上六點到七點間1號城市中的公尺特儲存器裡的公尺特會自動被消耗殆盡,即運輸方案不需要考慮首都的公尺特怎麼運走;

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

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

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

輸入格式:

第一行是乙個正整數n,表示城市的數目。

接下來n行,每行乙個正整數,其中的第i行表示第i個城市原來存在的公尺特儲存器的容量。

再接下來是n-i行,每行兩個正整數a,b表示城市b到城市a有一條高速通道(a≠b)。

輸出格式:

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

輸入樣例#1:複製

554

3211 2

1 32 4

2 5

輸出樣例#1:複製

3
【樣例解釋】

乙個最優解是將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

題意:給一棵樹,有點權,可以改變點權使得:同乙個父親的兒子權值必須相同,父親的取值必須是所有兒子權值之和

求最小改變量

可以得到只要知道任何乙個點的權值,就可以推完所有點

令f[i]表示不改變i號節點的值得到的根節點的值

然後排一遍序求最多有多少個相同

注意用log將乘法轉話為加法

#includeusing

namespace

std;

const

double eps = 1e-7

;const

int maxn = 5e5+10

;int

n,size,head[maxn],cost[maxn],ru[maxn];

double

f[maxn];

struct

edgee[maxn

<<1

];void adde(int u,int

v) void dfs(int u,int fa,double

dis)

}int

main()

ru[1]++;dfs(1,0,0

); sort(f+1,f+1+n);

int tmp=1,ans=0

;

for(int i=2;i<=n;i++)

}ans=max(ans,tmp);

printf("%d

",n-ans);

return0;

}

view code

HNOI2014 公尺特運輸

顯然知道乙個節點就可以推出整棵樹 然而直接乘會爆longlong 所以考慮取log 最後排序算眾數即可 include include include include include include define il inline define rg register define fill a,...

HNOI2014 公尺特運輸

原題鏈結 題目麻煩的一批。下面直接給簡化版 給一棵樹,每個點有乙個權值,要求修改一些點的權值,使得 同乙個父親的兒子權值必須相同 父親的取值必須是所有兒子權值之和 問最小要修改幾個點。很顯然這是乙個樹形dp。由於這個要求,樹上只要有乙個點確定,全樹的權值就都確定了。那麼我們只要計算將路徑上權值的累乘...

HNOI2014 公尺特運輸

首先我們需要看懂題目 然後我們需要發現乙個結論 只要有乙個節點的權值確定,那麼整棵樹的權值就確定了 然後我們根據這張,可以設 f i a i cdot prod f mathrm f 其中 f 是 i 的祖先,mathrm f 表示 f 的子節點的個數,a i 表示 i 的權值 於是我們可以用顯然法...