BZOJ 3573 Hnoi2014 公尺特運輸

2022-04-30 05:36:08 字數 813 閱讀 3871

bzoj_3573_[hnoi2014]公尺特運輸_樹形dp+hash

題意:給你一棵樹每個點有乙個權值,要求修改最少的權值,使得每個節點的權值等於其兒子的權值和且兒子的權值都相等。

分析:首先我們發現在樹中如果確定乙個點的權值,那麼整顆樹的方案就能夠確定

問題轉化成求哪個方案包含的點最多

如何求包含這個點的是哪個方案?

可以給每個點分配乙個新的權值

不妨假設1號點的權值不變

1號點的兒子的權值為原來的權值乘上1號點兒子的個數.......以此類推。

發現權值相同的點在乙個方案裡

由於權值可能很大,我們隨緣取模雜湊一下就行

**:#include #include #include using namespace std;

#define ll long long

#define n 500050

int head[n],to[n<<1],nxt[n<<1],val[n],cnt;

int n,son[n],dep[n];

ll now[n];

int h[1930010],p=1910009;

int ans,key[1930010];

inline void add(int u,int v)

void insert(ll x)

h[k]++;key[k]=x;

ans=max(ans,h[k]);

}void dfs(int x,int y)

}for(i=head[x];i;i=nxt[i])

}}int main()

for(i=1;i

bzoj 3573 Hnoi2014 公尺特運輸

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

BZOJ3573 Hnoi2014 公尺特運輸

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

bzoj3573 Hnoi2014 公尺特運輸

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