Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35843 | 22fhq | 【S】T4 | C++ | 解答错误 | 0 | 589 MS | 25932 KB | 3205 | 2025-01-05 19:07:43 |
#include <bits/stdc++.h> #define rep(i, x, y) for (int i = (x), _ = (y); i <= _; ++i) #define down(i, x, y) for (int i = (x), _ = (y); i >= _; --i) #define x first #define y second #define mp make_pair #define pb push_back #define bin(x) (1<<(x)) //#define LX_JUDGE using namespace std; typedef long long ll; typedef pair<int, int> pii; template<typename T> inline void upmax(T &x, T y) { x < y ? x = y : 0; } template<typename T> inline void upmin(T &x, T y) { x > y ? x = y : 0; } const int inf = 0x3f3f3f3f; const int N = 1e5 + 10; class SegmentTree { private : #define ls (o << 1) #define rs (o << 1 | 1) int val[N * 4], n; void build(int o, int l, int r) { val[o] = n + 1; if (l == r) return ; int mid = (l + r) / 2; build(ls, l, mid); build(rs, mid + 1, r); } void add(int o, int l, int r, const int p, const int v) { if (l == r) { val[o] = v; return ; } int mid = (l + r) / 2; mid >= p ? add(ls, l, mid, p, v) : add(rs, mid + 1, r, p, v); val[o] = min(val[ls], val[rs]); } int ask(int o, int l, int r, const int _l, const int _r) { if (_l <= l and r <= _r) return val[o]; int mid = (l + r) / 2; if (mid >= _r) return ask(ls, l, mid, _l, _r); if (mid < _l) return ask(rs, mid + 1, r, _l, _r); return min(ask(ls, l, mid, _l, _r), ask(rs, mid + 1, r, _l, _r)); } public : void init(int n) { this->n = n; build(1, 1, n); } void ins(int x, int y) { add(1, 1, n, x, y); } int ask(int l, int r) { return ask(1, 1, n, l, r); } #undef ls #undef rs } my; vector<int> adj[N]; inline void addEdge(int x, int y) { adj[x].pb(y); adj[y].pb(x); } int dep[N]; int fa[N][20], dis[N]; int st[N], nd[N], dfs_clock; int n, leaf; struct node { int x, d; node() {} node(int x, int d) : x(x), d(d) {} inline bool operator < (const node &b) const { return d < b.d; } }; int getAnc(int x, int d) { down (i, 18, 0) if (d & bin(i)) x = fa[x][i]; return x; } vector<int> Pool[N]; void DFS(int x) { st[x] = ++dfs_clock; for (int i = 0; fa[x][i]; ++i) fa[x][i + 1] = fa[fa[x][i]][i]; if (x != 1 and adj[x].size() == 1) { dis[x] = 0; leaf++; return ; } dis[x] = inf; for (int to : adj[x]) { if (to == fa[x][0]) continue ; fa[to][0] = x; dep[to] = dep[x] + 1; DFS(to); upmin(dis[x], dis[to] + 1); } nd[x] = dfs_clock; Pool[dis[x]].pb(x); } int calc(int H) { priority_queue<node> Q; vector<int> cs; for (int x : Pool[H]) Q.push(node(x, dep[x])); int res = 0; while (!Q.empty()) { node u = Q.top(); Q.pop(); if (dis[u.x] < H or my.ask(st[u.x], nd[u.x]) - u.d < H) continue ; res++; cs.pb(st[u.x]); my.ins(st[u.x], u.d); if (dep[u.x] >= H) { int y = getAnc(u.x, H); Q.push(node(y, dep[y])); } } for (int to : cs) my.ins(to, n + 1); return res; } int Ans[N]; int main() { scanf("%d", &n); rep (i, 2, n) { int x, y; scanf("%d%d", &x, &y); addEdge(x, y); } DFS(1); my.init(n); rep (i, 1, n) Ans[i] = calc(i) + leaf; int Q; scanf("%d", &Q); while (Q--) { int x; scanf("%d", &x); printf("%d\n", Ans[min(x, n)]); } return 0; }