L2-043 龙龙送外卖(团体程序设计天梯赛-练习集)

L2-043 龙龙送外卖

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 100010;

int n, m;
int p[MAXN], f[MAXN];
int maxv;

//从u结点走,向根节点(已经经过的结点)走了d步,返回走了的最大步数
int dfs(int u, int d){
    if(p[u] == -1 || f[u]){
        maxv = max(maxv, d + f[u]);
        return d * 2;
    }
    int t = dfs(p[u], d + 1);
    f[u] = f[p[u]] + 1;

    return t;
}

int main(){
	cin >> n >> m;
    for(int i = 1; i <= n; i++){
        int x;
        cin >> x;
        p[i] = x;
    }
    int sum = 0;
    for(int i = 1; i <= m; i++){
        int x;
        cin >> x;
        sum += dfs(x, 0);
        cout << sum - maxv << endl;
    }
	
    return 0;
}
posted @ 2025-03-08 11:34  awei040519  阅读(27)  评论(0)    收藏  举报