MnZn 50pt 求调
查看原帖
MnZn 50pt 求调
568884
AFLeartLey0103楼主2022/8/29 13:48

rt

WA on 1 2 4 6 10

#include<bits/stdc++.h>
using namespace std;
const int maxn = 150;
const int seed = 993244853;
typedef unsigned long long hs;
class tree{
public:
    int fa[maxn], size[maxn], weight[maxn];
    hs hashval[maxn];
    vector<int> E[maxn];
    int centroid[2], n, root;
    int ansCentroid[2];

    void getCent(int crt){
        size[crt] = 1;
        weight[crt] = 0;
        for(auto i:E[crt]){
            if(i != fa[crt]){
                getCent(i);
                size[crt] += size[i];
                weight[crt] = max(weight[crt],size[i]);
            }
        }
        weight[crt] = max(weight[crt],n - size[crt]);
        if(weight[crt] <= n/2)
            centroid[centroid[0] != 0] = crt;
    }

    void gethash(int crt){
        hs lis[maxn];
        size[crt] = 1;
        for(auto i:E[crt]){
            if(i!=fa[crt]){
                fa[i] = crt;
                gethash(i);
                size[crt] += size[i];
            }
        }
        int cnt = 0;
        for(auto i:E[crt]){
            if(i != fa[crt])lis[cnt++] = hashval[i];
        }
        std::sort(lis,lis+cnt);

        hs val = 0;
        for(int i = 0;i<cnt;++i)
            val = val*seed + lis[i];
        hashval[crt] = val ? val*size[crt] : 1;
    }

    tree(){
        centroid[0] = centroid[1] = 0;
        cin >> n;
        for(int i = 1;i<=n;++i){ 
            int f;
            cin >> f;
            if(f){
                fa[i] = f;
                E[f].push_back(i), E[i].push_back(f);
            }
            else{
                root = i;
            }
        }
        getCent(root);
        memset(size,0,sizeof(size));
        memset(fa,0,sizeof(fa));
        gethash(centroid[0]);
        ansCentroid[0] = hashval[centroid[0]];
        if(centroid[1]){
            memset(size,0,sizeof(size));
            memset(fa,0,sizeof(fa));
            ansCentroid[1] = hashval[centroid[1]];
        }
    }
};
hs anspair[maxn][3];
map<pair<pair<hs,hs>,int>, int> ans;
signed main(){
    int m;
    cin >> m;
    for(int i = 1;i<=m;++i){
        tree T;
        hs Tfst = T.ansCentroid[0], Tsec = T.ansCentroid[1];
        if(Tfst<Tsec)Tfst ^= Tsec ^= Tfst ^= Tsec;
        if(ans[make_pair(make_pair(Tfst,Tsec),T.n)]==0)ans[make_pair(make_pair(Tfst,Tsec),T.n)] = i;
        anspair[i][0] = Tfst,anspair[i][1] = Tsec;
        anspair[i][2] = T.n;
    }
    for(int i = 1;i<=m;++i){
        cout << ans[make_pair(make_pair(anspair[i][0],anspair[i][1]),anspair[i][2])] << '\n';
    }
    return 0;
}
2022/8/29 13:48
加载中...