BZOJ3573 Hnoi2014 公尺特運輸

2022-05-08 04:45:07 字數 1170 閱讀 2432

作者部落格:

正解:排序+分析

解題報告:

題目給出的各項約束條件,其實就是想告訴我們乙個這樣的模型:

每個點的權值$=$父親節點的權值*父親節點的兒子節點個數,修改盡量少的點權使得滿足要求。

然後可以發現,只要確定了乙個點填什麼,整棵樹的點權其實就唯一確定了…

考慮兩個點$u$、$v$,令$dis[x]=$x走到根需要乘的數(也就是到根的路徑上的每個節點的兒子節點個數的連乘),令$a$表示點權,他們兩個可以同時不修改,當且僅當$a[u]*dis[u]=a[v]*dis[v]$,不妨設為$c$,把每個數的$c$算出來,答案就是$n-tot$,$tot$表示出現次數最多的那個$c$的出現次數。因為連乘起來數字太大,可以用$hash$或者取對數。

//it is made by ljh2000

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int maxn = 500011;

const int maxm = 1000011;

const long double eps = 1e-8;//eps!!!

int n,a[maxn],ecnt,first[maxn],to[maxm],next[maxm],son[maxn],ans;

long double p[maxn];

inline int getint()

inline bool cmp(long double x,long double y)

inline void dfs(int x,int fa)

}inline void dfs2(int x,int fa,long double lei)

}inline void work()

dfs(1,0); dfs2(1,0,0); p[1]+=log(a[1]); sort(p+1,p+n+1); x=1;

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

} printf("%d",n-ans);

}int main()

bzoj 3573 Hnoi2014 公尺特運輸

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

BZOJ 3573 Hnoi2014 公尺特運輸

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

bzoj3573 Hnoi2014 公尺特運輸

好吧,雖然這是day1最後一題,但卻是最水的一題。前提 看懂題目 仔細看題!仔細看題!仔細看題!看懂題後就知道設第 i 個點的兒子節點的個數為 degree i 容量為 a i 我們要修改最少的點的容量,使得每個點 i 的兒子的容量均為 frac 我們發現如果乙個點的容量是確定的,那麼整個樹的容量都...