Submission #1286373

#TimeUsernameProblemLanguageResultExecution timeMemory
1286373LuvidiWorld Map (IOI25_worldmap)C++20
50 / 100
42 ms5828 KiB
#include "worldmap.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define pii pair<int,int>

vector<int> ad[41],st;
vector<pii> bs;
int d[41];
bool vs[41];

void dfs(int v){
    vs[v]=1;
    st.pb(v);
    for(int u:ad[v]){
        if(vs[u]){
            if(d[v]-d[u]>1)bs.pb({u,v});
        }else{
            d[u]=d[v]+1;
            dfs(u);
            st.pb(v);
        }
    }
}

std::vector<std::vector<int>> create_map(int n, int m, std::vector<int> a, std::vector<int> b) {
    for(int i=1;i<=n;i++){
        ad[i].clear();
        vs[i]=0;
    }
    st.clear();
    for(int i=0;i<m;i++){
        ad[a[i]].pb(b[i]);
        ad[b[i]].pb(a[i]);
    }
    bs.clear();
    dfs(1);
    while(d[st[st.size()-2]]==d[st.back()]+1)st.pop_back();
    // for(int i:st)cout<<i<<' ';
    // cout<<'\n';
    // for(auto[x,y]:bs)cout<<x<<' '<<y<<'\n';
    bool bb[n+1];
    memset(bb,0,sizeof(bb));
    vector<int> be[n+1];
    while(1){
        int c[n+1];
        memset(c,0,sizeof(c));
        for(auto[x,y]:bs){
            if(!bb[x]&&!bb[y]){
                c[x]++;
                c[y]++;
            }
        }
        int id=max_element(c+1,c+n+1)-c;
        if(!c[id])break;
        for(auto[x,y]:bs){
            if(!bb[x]&&!bb[y]){
                if(x==id)be[id].pb(y);
                if(y==id)be[id].pb(x);
            }
        }
        bb[id]=1;
        // cout<<id<<' '<<c[id]<<'\n';
    }

    vector<int> t;
    int id[n+1],rm[n+1];
    memset(id,-1,sizeof(id));
    memset(rm,0,sizeof(rm));
    for(int i:st){
        t.pb(i);
        if(id[i]==-1&&bb[i]){
            id[i]=t.size();
            t.pb(i);
            t.pb(i);
        }
    }
    st=t;
    int sz=st.size();
    vector<vector<int>> ans(sz,vector<int>(sz));
    for(int i=0;i<sz;i++){
        for(int j=0;j<sz;j++)ans[i][j]=st[j];
    }
    for(int i=1;i<=n;i++){
        for(int j:be[i]){
            ans[rm[i]][id[i]]=j;
            rm[i]+=2;
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...