1 条题解

  • 0
    @ 2022-8-12 20:39:43

    #include <iostream> #include <cmath> #include <set>

    using namespace std; int n, m, sum, rt, cnt, mid, head[100010],nxt[100010],v[100010],w[100010],tot = 0; void add(int x,int y,int z){ v[++tot] = y; w[tot] = z; nxt[tot] = head[x]; head[x] = tot; } int dfs(int u, int fa){ int ret = 0, x; multiset<int> ms; multiset<int>::iterator it; for (int i = head[u]; i; i = nxt[i]) if (v[i]!=fa){ x = w[i] + dfs(v[i],u); if (x >= mid) cnt++; else ms.insert(x); } while (!ms.empty()){ it = ms.begin(); x = *it; ms.erase(it); it = ms.lower_bound(mid - x); if (it!=ms.end()){ cnt ++; ms.erase(it); }else ret = max(ret,x); } return ret; } int main(){ cin >> n >> m; int x, y , z; for(int i = 1; i < n; i++){ cin >> x >> y >> z; add(x, y, z); add(y, x, z); sum += z; } rt = rand() % n + 1; int l = 1,r = sum / m, ans=0; while (l <= r){ mid = (l + r) / 2; cnt = 0; dfs(rt,0); if (cnt >= m){ ans = mid; l = mid + 1; }else r = mid - 1; } cout << ans << endl; return 0; }

    • 1

    信息

    ID
    403
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    12
    已通过
    4
    上传者