Submission #1217238

#TimeUsernameProblemLanguageResultExecution timeMemory
1217238Ak_16Chorus (JOI23_chorus)C++20
In queue
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;
vector<int> adj[2005];
int st[2005];
int par[2005];
int dep[2005];
int lis[100];
int nolis[105];
int mx;
int n;

int con[2005];
int psum[105];
int ssum[105];


int dp[100][100];

void dfs(int no, int pa){
     for(auto x : adj[no]){
        if(x!=pa){
            dfs(x, no);
            st[no] += st[x];
            con[no] -= (st[x]) * (st[x]-1) / 2;
        }
     }
     con[no] -= (n-st[no])*(n-st[no]-1) / 2;
     con[no]++;
     return;
}

void dfs2(int no, int pa){

   dep[no] = dep[pa] + 1;
   par[no] = pa;

    for(auto x : adj[no]){
        if(x!=pa){
            dfs2(x, no);
        }
    }
    return;
}
void dfs3(int no, int pa){
    for(auto x : adj[no]){
        if(x!=pa){
            dfs3(x, no);
            st[no] += st[x];
        }
    }
    return;
}

   
   

   
   


int main(){
    cin.tie(nullptr);
    int t,u,v;
    int deg[10005];
    for(int i=0; i<=99; i++){
        for(int j=0; j<=99; j++){
            dp[i][j] = 0;
        }
    }

    int mxd=0;

    dep[0] = -1;

    cin>>t;
    while(t--){
        cin>>n;
        for(int i=1; i<=n; i++){
            adj[i].clear();
            deg[i] = 0;
            st[i] = 1;
        }
        for(int i=1; i<=n; i++){
            con[i] = n*(n-1)/2;
        }

        for(int i=1; i<n; i++){
            cin>>u>>v;
            adj[u].push_back(v);
            adj[v].push_back(u);
            deg[u]++;
            deg[v]++;
        }

        mxd = 0;

        for(int i=1; i<=n; i++){
            mxd = max(mxd, deg[i]);
        }

        if(mxd==2){cout<<2*n-1<<" ";}
        else {cout<<n+1<<" ";}
        
        mx = 0;

        dfs(1, 0);
        

        for(int i=1; i<=n; i++){
            for(int j=1; j<=n; j++){
               
                if(j==i){continue;}

                dep[0] = -1;
                dfs2(i, 0);

                for(int k=1; k<=n; k++){
                    st[k] = 1;
                }

                dfs3(i, 0);
                int num = dep[j];
                

                for(int l=1; l<=dep[j]+1; l++){
                    for(int r=l; r<=dep[j]+1; r++){
                        dp[l][r] = 0;
                    }
                }

                for(int k = j; k!=0; k=par[k]){
                    lis[dep[k]+1] = k;
                }

                for(int k=1; k<=num+1; k++){
                    if(k==1){nolis[k] = 1;}
                    else if(k==num+1){nolis[k] = 1;}
                    else {
                        nolis[k] = st[lis[k]] - st[lis[k+1]];
                    }
                }

                psum[0] = 0;
                ssum[num+2] = 0;

                for(int k=1; k<=num+1; k++){
                    psum[k] = psum[k-1] + nolis[k];
                }

                for(int k=num+1; k>=1; k--){
                    ssum[k] = ssum[k+1] + nolis[k];
                }



                for(int pl = 0; pl<=dep[j]; pl++){
                   for(int l=1; l<=num+1-pl; l++){
                    if(pl==0){dp[l][l] = con[lis[l]];}

                    else {
                       dp[l][l+pl] = psum[l] * ssum[l+pl] + max(dp[l][l+pl-1], dp[l+1][l+pl]);
                    }
                   }
                }

               mx = max(mx, dp[1][num+1]);

               
            }
        }

        
        cout<<mx<<endl;
        

    }
}