求助,样例过了,实测没过
查看原帖
求助,样例过了,实测没过
363006
wangyibo201026楼主2022/2/20 18:53
#define debug
#include<bits/stdc++.h>

using namespace std;

const int N = 5e5 + 5;

int n = 4, m;
int u = 3, v = 2;

int dis[N];

int dep[N], dp[N][25];

int lca(int x, int y) {
  if(dep[x] > dep[y]) {
    swap(x, y);
  }
  for(int i = 24; i >= 0; i--) {
    if(dep[x] <= dep[dp[y][i]]) {
      y = dp[y][i];
    }
  }
  if(x == y) {
    return x;
  }
  for(int i = 24; i >= 0; i--) {
    if(dp[x][i] != dp[y][i]) {
      x = dp[x][i], y = dp[y][i];
    }
  }
  return dp[x][0];
}

void update(int x){
  int zhijing_3 = dis[u] + dis[v] - 2 * dis[lca(u, v)];
  int zhijing_1 = dis[x] + dis[u] - 2 * dis[lca(x, u)];
  int zhijing_2 = dis[x] + dis[v] - 2 * dis[lca(x, v)];
  if(zhijing_3 > zhijing_1 && zhijing_3 > zhijing_2){
    return ;
  }
  else if(zhijing_1 > zhijing_2){
    v = x;
  }
  else{
    u = x;
  }
}

void Solve(){
  cin >> m;
  dis[2] = dis[3] = dis[4] = 1;
  dep[1] = 0;
  dep[2] = dep[3] = dep[4] = 1;
  dp[2][0] = dp[3][0] = dp[4][0] = 1;
  while(m--){
    int x;
    cin >> x;
    dep[n + 1] = dep[x] + 1;
    dep[n + 2] = dep[x] + 1;
    dis[n + 1] = dis[x] + 1;
    dis[n + 2] = dis[x] + 1;
    dp[n + 1][0] = dp[n + 2][0] = x;
    for(int i = 1; i <= 20; i++){
      dp[n + 1][i] = dp[dp[n + 1][i - 1]][i - 1];
    }
    for(int i = 1; i <= 20; i++){
      dp[n + 2][i] = dp[dp[n + 2][i - 1]][i - 1];
    }
    update(n + 1);
    update(n + 2);
    n += 2;
    cout << dis[u] + dis[v] - 2 * dis[lca(u, v)] << endl;
  }
}

int main(){
#ifdef debug
  freopen("Code.in", "r", stdin);
  freopen("Code.out", "w", stdout);
#endif
  Solve();
  return 0;
}

求助大佬。

2022/2/20 18:53
加载中...