intmain(){ int n, m; scanf("%d%d", &n, &m); int maxque = 0; for (int i = 1; i <= m; ++i) scanf("%d", &que[i]), maxque = std::max(maxque, que[i]); for (int i = 2, u, v; i <= n; ++i) { scanf("%d", &u), v = i; AddEdge(u, v), AddEdge(v, u); } Dfs(1, 0); int maxdep = 0; for (int i = 1; i <= n; ++i) ++cnt[dep[i]], maxdep = std::max(maxdep, dep[i]); for (int i = maxdep; i >= 0; --i) s[i] = s[i + 1] + cnt[i + 1]; std::vector<int> q; q.resize(N); int hd = 0, tl = 0; for (int i = 1; i <= maxdep; ++i) { while (hd < tl && Slope(q[tl - 1], q[tl]) <= Slope(q[tl], i)) --tl; q[++tl] = i; } for (int i = 1; i <= maxque; ++i) { while (hd < tl && i * q[hd] + s[q[hd]] <= i * q[hd + 1] + s[q[hd + 1]]) ++hd; dp[i] = q[hd] + ceil(1.0 * s[q[hd]] / i); } for (int i = 1; i <= m; ++i) printf("%d ", dp[que[i]]); printf("\n"); return0; }
不过有两个玄学问题qwq
一个是为什么这一题 Slope 那里返回值为 int 也能过,还有一个是为什么我写的 deque 挂了。
1 2 3 4 5 6 7 8 9 10 11 12
std::deque<int> q; for (int i = 1; i <= maxdep; ++i) { while (q.size() >= 2 && Slope(q[q.size() - 2], q[q.size() - 1] <= Slope(q[q.size() - 1], i))) q.pop_back(); q.push_back(i); } for (int i = 1; i <= maxque; ++i) { while (q.size() >= 2 && i * q[0] + s[q[0]] <= i * q[1] + s[q[1]]) q.pop_front(); dp[i] = q[0] + ceil(1.0 * s[q[0]] / i); }