建图跑个bfs就好了= - =
#include <bits/stdc++.h> using namespace std; const int N=2e5+5; vector<int>v[N]; int vis[N],dis[N]; queue<int>q; void bfs() { while(q.size()) { int temp=q.front(); q.pop(); for(int i=0;i<v[temp].size();i++) { int pos=v[temp][i]; if(vis[pos]) continue; vis[pos]=1; q.push(pos); dis[pos]=dis[temp]+1; // if(pos==6) cout<<temp<<' '<<dis[pos]<<endl; } } } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int x; scanf("%d",&x); v[i].push_back(x); } for(int i=2;i<=n;i++) { v[i].push_back(i-1); v[i-1].push_back(i); } q.push(1); dis[1]=0;vis[1]=1; bfs(); for(int i=1;i<=n;i++) { printf("%d ",dis[i]); }puts(""); return 0; }