递归小错误

递归记得返回下级递推的结果

错误

#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

posted @ 2021-12-06 21:16  我要就问一就问一句  阅读(29)  评论(0)    收藏  举报