題目鏈結
自己假自己,怎麼寫都只能過一半的測試點,學了別人的題解。
題目描述
給定一棵樹,每個結點有乙個權值,求\(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 ...