我是小孩,打 VP 被这题硬控一小时,造了十几组数据硬是没 hack
查看原帖
我是小孩,打 VP 被这题硬控一小时,造了十几组数据硬是没 hack
466525
Anaxagoras楼主2024/11/7 12:34
//by olkieler
#include <bits/stdc++.h>
#define int long long
#define inf INT_MAX
#define N 100005
#define mod 1000000007
using namespace std;
inline int r() {int x; cin >> x; return x;}
inline void w(int x) {cout << x << '\n';}
inline void W(int x) {cout << x << ' ';}
struct node {
    int next, pointer;
} edge[N << 1];
int n, k, tot, cut;
int head[N];
int son[N];
int sz[N];
int tag[N];
inline void add(int u, int v) {
    edge[++ tot].next = v, 
    edge[tot].pointer = head[u], 
    head[u] = tot;
}
inline void calc(int x, int f) {
    son[x] = 1;
    for (int i = head[x]; i; i = edge[i].pointer) if (edge[i].next != f) calc(edge[i].next, x), son[x] += son[edge[i].next];
}
inline void dfs(int f, int x, int siz) {
    if (sz[x] < siz) return ;
    for (int i = head[x]; i; i = edge[i].pointer) {
        if (edge[i].next != f) dfs(x, edge[i].next, siz);
        if (cut >= k) return ;
    }
    if (sz[x] - tag[x] >= siz && sz[1] - sz[x] + tag[x] >= siz) sz[1] -= sz[x], cut ++, tag[f] += sz[x];
    tag[f] += tag[x];
}
inline bool check(int x) {
    cut = 0;
    for (int i = 1; i <= n; i ++) sz[i] = son[i], tag[i] = 0;
    dfs(0, 1, x);
    return cut >= k;
}
signed main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int t = r();
    while (t --) {
        tot = 0, n = r(), k = r();
        int L = 0, R = N - 5;
        for (int i = 1; i < n; i ++) {
            int u = r(), v = r();
            add(u, v), add(v, u);
        }
        calc(1, 0);
        while (R - L > 1) {
            int mid = L + R >> 1;
            if (check(mid)) L = mid;
            else R = mid;
        }
        w(L);
        for (int i = 1; i <= n; i ++) head[i] = 0;
    }
    return 0;
}
2024/11/7 12:34
加载中...