造数据hack掉它
  • 板块CF2018C Tree Pruning
  • 楼主siudh
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/19 11:20
  • 上次更新2024/10/19 13:41:12
查看原帖
造数据hack掉它
833999
siudh楼主2024/10/19 11:20
#include <bits/stdc++.h>
#include<array>
using namespace std;
#define int long long
const int mod = 11380;
const int INF = 0x3f3f3f3f;
const int N = 2 * 1e5 + 10;
int T = 1;
int up = 0;
int fa[N];
int get_fa(int x)
{
    if (x == fa[x])
        return x;
    return fa[x] = get_fa(fa[x]);
}
vector<vector<int>>g(N);
int dep[N];
int Siz[N], dSiz[N];
vector<pair<int, int>>leaf;
bool cmp(pair<int, int>a, pair<int, int>b)
{
    return a.first < b.first;
}
void dfs(int u, int fa)
{
    Siz[u] = 1;
    if (g[u].size() == 1 && u != 1)
        leaf.push_back({ dep[u],u });
    for (int i = 0; i < g[u].size(); i++)
    {
        int v = g[u][i];
        if (v == fa)
            continue;
        dep[v] = dep[u] + 1;
        dfs(v, u);
        Siz[u] += Siz[v];
        dSiz[dep[u]] += Siz[v];
    }
}
int F[N][32];
int vis[N];
void bfs(int s)
{
    queue<int>q;
    q.push(s);
    vis[s] = 1;
    while (!q.empty())
    {
        int u = q.front();
        q.pop();
        for (int i = 0; i < g[u].size(); i++)
        {
            int v = g[u][i];
            if (vis[v])
                continue;
            q.push(v);
            vis[v] = 1;
            F[v][0] = u;
            for (int i = 1; i <= up; i++)
                F[v][i] = F[F[v][i - 1]][i - 1];
        }
    }
}
int lca(int x, int y)
{
    if (dep[x] > dep[y])
        swap(x, y);
    for (int i = up; i >= 0; i--)
        if (dep[F[y][i]] >= dep[x]) y = F[y][i];
    if (x == y)
        return x;
    for (int i = up; i >= 0; i--)
    {
        if (F[x][i] != F[y][i]) x = F[x][i], y = F[y][i];
    }
    return F[x][0];
}
void solve() {
    int n;
    cin >> n;
    up = (int)(log(n) / log(2)) + 1;
    leaf.clear();
    for (int i = 1; i <= n; i++)
        g[i].clear(), F[i][0] = 0, dSiz[i] = Siz[i] = dep[i] = 0;
    for (int i = 1; i <= n - 1; i++)
    {
        int u, v;
        cin >> u >> v;

        g[u].push_back(v);
        g[v].push_back(u);
    }
    dep[1] = 1;
    dfs(1, -1);
    memset(vis, 0, sizeof(vis));
    bfs(1);
    sort(leaf.begin(), leaf.end(), cmp);

    int pref = 0;
    int ans = INF;
    for (int i = 1; i < leaf.size(); i++)
    {
        int LCA = lca(leaf[i - 1].second, leaf[i].second);
        ans = min(ans, pref + dSiz[leaf[i - 1].first]);
        if (leaf[i - 1].first != leaf[i].first)
            pref += (leaf[i - 1].first - dep[LCA]);
        else
            pref++;
    }
    ans = min(ans, pref);
    cout << (ans == INF ? 0 : ans) << endl;
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> T;
    while (T--) {
        solve();
    }
}

请造数据hack掉他

2024/10/19 11:20
加载中...