牛客 msc的寵物 二分 樹形dp

2022-05-07 03:51:13 字數 978 閱讀 9456

題目鏈結

自己假自己,怎麼寫都只能過一半的測試點,學了別人的題解。

題目描述

給定一棵樹,每個結點有乙個權值,求\(k+1\)個連通塊中最值之差的最小值是多少。

思路

二分答案很顯然,主要是用樹形dp計算最少需要的次數。

\(dp[u][i]\):結點\(u\)的值\(a[u]\)在範圍為\([a_i,a_i + mid]\)中,且滿足其子樹所有點的值在該範圍中時需要刪除的邊數。

\(f[u]\):結點\(u\)所需要刪除的最少的邊的數量。

轉移方程:\(dp[u][i]=min(dp[v][i],f[v]+1)\)

**

#includeusing namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const int n = 1010;

ll dp[n][n], f[n];

ll a[n];

vectore[n];

int n, k;

void dfs(int u, int fa, ll mid) else dp[u][i] = inf;

}for(int i = 0; i < e[u].size(); i++)

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

}bool check(ll mid)

void solve()

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

ll l = 0, r = 2e9;

ll res = -1;

while(l <= r) else l = mid + 1;

}printf("%lld\n", res);

}int main()

牛客 求交集(二分)

給你兩個公升序排列的集合,求出兩個集合的交集。有多個測試用例,輸入到檔案結束。對於每乙個測試用例 第一行輸入兩個整數n,m 0示例1 2 31 31 2 3 1 3 交集為空的情況下,輸出 empty 題意 思路 一開始沒想到用二分,先想的是map對映一下,時間很短,但是記憶體超了qaq,感覺這個題...

hdu 3586 樹形dp 二分

題意 給n個節點的樹,要求使葉子節點與根斷開,割掉的邊的權值和不超過m。求這些被割邊的權值最大中的最小。dp u min dp v w w 為 u 到 v 的權值。如果w 大於二分的 mid dp u dp v 二分列舉邊權。include include include includeusing ...

hdu 3586 樹形dp 二分

題目大意 給定n個敵方據點,1為司令部,其他點各有一條邊相連構成一棵 樹,每條邊都有乙個權值cost表示破壞這條邊的費用,葉子節點為前線。現要切斷前線和司令部的聯絡,每次切斷邊的費用不能超過上限limit,問切斷所 有前線與司令部聯絡所花費的總費用少於m時的最小limit。1 n 1000,1 m ...