递归小错误
递归记得返回下级递推的结果
错误
#include <bits/stdc++.h> using namespace std; int b[200010]; int p[200010]; int fa[200010]; bool vis[200010]; bool is_fa[200010]; int no[200010]; int dist[200010]; bool find(int point) { vis[point]=true; if(no[point]<no[fa[point]]) { ///cout<<point<<' '<<fa[point]<<' '<<no[point]<<' '<<no[fa[point]]<<endl; return false; } else if(!vis[fa[point]]) { find(fa[point]); } return true; } int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin>>t; while(t--) { int n; cin>>n; bool is_ex=true; memset(fa,0,sizeof fa); memset(vis,false,sizeof vis); memset(is_fa,false,sizeof is_fa); memset(dist,0,sizeof dist); for(int i=1;i<=n;i++) { cin>>b[i]; fa[i]=b[i]; is_fa[b[i]]=true; } // for(int i=1;i<=n;i++) // { // if(!is_fa[i]) cout<<"kkk"<<i; // } // cout<<endl; for(int i=1;i<=n;i++) { cin>>p[i]; no[p[i]]=i; } for(int i=1;i<=n;i++) { if(!is_fa[i]) { if(!find(i)) { is_ex=false; break; } } } if(!is_ex) { cout<<-1<<endl; continue; } for(int i=2;i<=n;i++) { dist[p[i]]=dist[p[i-1]]+1; } for(int i=1;i<=n;i++) { cout<<dist[i]-dist[fa[i]]<<' '; } cout<<endl; } }
正确:
#include <bits/stdc++.h> using namespace std; int b[200010]; int p[200010]; int fa[200010]; bool vis[200010]; bool is_fa[200010]; int no[200010]; int dist[200010]; bool find(int point) { vis[point]=true; if(no[point]<no[fa[point]]) { ///cout<<point<<' '<<fa[point]<<' '<<no[point]<<' '<<no[fa[point]]<<endl; return false; } else if(!vis[fa[point]]) { return find(fa[point]); } return true; } int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin>>t; while(t--) { int n; cin>>n; bool is_ex=true; memset(fa,0,sizeof fa); memset(vis,false,sizeof vis); memset(is_fa,false,sizeof is_fa); memset(dist,0,sizeof dist); for(int i=1;i<=n;i++) { cin>>b[i]; fa[i]=b[i]; is_fa[b[i]]=true; } // for(int i=1;i<=n;i++) // { // if(!is_fa[i]) cout<<"kkk"<<i; // } // cout<<endl; for(int i=1;i<=n;i++) { cin>>p[i]; no[p[i]]=i; } for(int i=1;i<=n;i++) { if(!is_fa[i]) { if(!find(i)) { is_ex=false; break; } } } for(int i=2;i<=n;i++) { dist[p[i]]=dist[p[i-1]]+1; } for(int i=1;i<=n;i++) { if(dist[i]-dist[fa[i]]<0) { is_ex=false; } }if(!is_ex) { cout<<-1<<endl; continue; } for(int i=1;i<=n;i++) { cout<<dist[i]-dist[fa[i]]<<' '; } cout<<endl; } }
https://codeforces.com/contest/1611/problem/D

浙公网安备 33010602011771号