cats 的資料結構

D06發表於2024-08-26
  • 相信OI美學
點選檢視程式碼
#include <bits/stdc++.h> 
using namespace std;
vector<int>a[200005];
int f[200005],s[200005],ansa[200005],ansb[200005];
void dp(int n1)
{
    s[n1]=1;
    f[n1]=n1;
    for(int i=0;i<a[n1].size();i++)
    {
        dp(a[n1][i]);
        s[n1]+=s[a[n1][i]];
        f[n1]=min(f[n1],f[a[n1][i]]);
    }
}
bool cmp(int a,int b)
{
    return f[a]<f[b];
}
void dfs(int n1,int l1,int r1,int l2,int r2)
{
    ansa[n1]=r1;
    ansb[n1]=r2;
    r1--;
    r2--;
    sort(a[n1].begin(),a[n1].end(),cmp);
    for(int i=0;i<a[n1].size();i++)
    {
        dfs(a[n1][i],l1,l1+s[a[n1][i]]-1,r2-s[a[n1][i]]+1,r2);
        l1=l1+s[a[n1][i]];
        r2=r2-s[a[n1][i]];
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            a[i].clear();
        }
        for(int i=2;i<=n;i++)
        {
            int p;
            cin>>p;
            a[p].push_back(i);
        }
        dp(1);
        dfs(1,1,n,1,n);
        cout<<ansa[1]<<' '<<ansb[1];
        for(int i=2;i<=n;i++)
        {
            cout<<' '<<ansa[i]<<' '<<ansb[i];
        }
        cout<<"\n";
    }
    return 0;
}

相關文章