L2-043 龙龙送外卖(天梯赛)
首先这个题目正面模拟是不可能的 因为加入这个点后的改变值不好算
那就整体想 因为要到其他外卖点 所以有很多边是要走两遍的 一去一回 但是又不用再回到外卖站 不回到外卖站一定是到最远的那个
所以很清晰了 对于外卖站到每个外卖点覆盖的路径*2-最长的一条
#include
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int n, m, rt;
cin >> n >> m;
vector> G(n + 1);
vector p(n + 1);
for(int i = 1, x; i <= n; ++ i) {
cin >> x;
if(x == -1) rt = i;
else {
G[x].push_back(i);
p[i] = x;
}
}
vector d(n + 1);
auto dfs = [&](auto self, int u) -> void {
for(int &v : G[u]) {
d[v] = d[u] + 1;
self(self, v);
}
};
d[rt] = 0;
dfs(dfs, rt);
vector st(n + 1);
st[rt] = 1;
int ans = 0, mx = 0;
while(m -- ) {
int x;
cin >> x;
mx = max(mx, d[x]);
while(st[x] == 0) {
st[x] = 1;
x = p[x];
ans ++;
}
cout << ans * 2 - mx << "\n";
}
return 0;
}