公尺特是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)。
n<500000,a[j]<10^8
輸出檔案僅包含一行,乙個整數,表示最少的被重建(即修改儲存器容量)的公尺特儲存器的數目。
554
3211 2
1 32 4
2 5
3
閱讀題。。
讀懂題意就差不多做完了。。
大意就是給你一棵樹,一開始每個點有乙個權值,然後要你修改盡可能少的點權,使得每個點的點權等於他兒子的點權之和,且兒子的點權都相等。其中1為根節點。
可以發現確定了乙個點的權值之後,整棵樹的權值都確定了,所以不妨設根節點的權值為\(x\),則對於點\(u\),權值就是:
\[x\cdot \prod_\frac
\]反過來,若不改變\(u\)的權值,就可以確定根節點的權值,設當前的權值為\(x\),則:
\[val_=x\cdot \prod deg[v]
\]由於後面那個玩意會爆\(long\,\,long\),所以(當然寫高精度啊)兩邊取\(\ln\):
\[\ln val_=\ln x + \sum \ln deg[v]
\]然後前面相等的時候屬於同一種方案,\(sort\)一下就行了。
#includeusing namespace std;
#define online_judge
#ifdef online_judge
#define getchar() ((p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin)),p1==p2)?eof:*p1++)
#endif
namespace fast_io
template inline void read(t& x,args& ...args)
char buf2[1<<21],a[80];int p,p3=-1;
inline void flush()
template inline void write(t x) while(x/=10);
do while(--p);
buf2[++p3]='\n';
} template inline void write(t x,args ...args)
}using fast_io :: read;
using fast_io :: write;
using fast_io :: flush;
#define lf double
#define ln log
const lf eps = 1e-8;
const int maxn = 5e5+10;
int val[maxn],n,deg[maxn],head[maxn],tot;;
lf f[maxn];
struct edgee[maxn<<1];
void add(int u,int v) ,head[u]=tot;}
void ins(int u,int v)
void dfs(int x,int fa)
int main() write(ans);
flush();
return 0;
}
bzoj 3573 Hnoi2014 公尺特運輸
題目好難懂。簡述題意 給出一棵樹,要求滿足兩個要求 1.每個節點的子節點權值相等。2.每個節點的權值和是這個節點的權值。然後就出最小修改點的數量來滿足這個要求。那麼顯而易見只要確定乙個節點就可以確定群圖節點權值。這樣列舉是 通過這個結論我們發現只要確定1就可以確定全圖,所以可以通過讓每乙個節點權值不...
BZOJ 3573 Hnoi2014 公尺特運輸
bzoj 3573 hnoi2014 公尺特運輸 樹形dp hash 題意 給你一棵樹每個點有乙個權值,要求修改最少的權值,使得每個節點的權值等於其兒子的權值和且兒子的權值都相等。分析 首先我們發現在樹中如果確定乙個點的權值,那麼整顆樹的方案就能夠確定 問題轉化成求哪個方案包含的點最多 如何求包含這...
BZOJ3573 Hnoi2014 公尺特運輸
作者部落格 正解 排序 分析 解題報告 題目給出的各項約束條件,其實就是想告訴我們乙個這樣的模型 每個點的權值 父親節點的權值 父親節點的兒子節點個數,修改盡量少的點權使得滿足要求。然後可以發現,只要確定了乙個點填什麼,整棵樹的點權其實就唯一確定了 考慮兩個點 u v 令 dis x x走到根需要乘...