Submission #1257386

#TimeUsernameProblemLanguageResultExecution timeMemory
1257386Muhammad_AneeqWorld Map (IOI25_worldmap)C++20
0 / 100
3 ms584 KiB
#include "worldmap.h"
#include "bits/stdc++.h"
using namespace std;
int const MN=45;
vector<int>nei[MN]={};
set<int>rel[MN]={};
int par[MN]={};
int h[MN]={};
int pr[MN]={};
int root(int n)
{
    return (par[n]==n?n:par[n]=root(par[n]));
}
bool merge(int u,int v)
{
    u=root(u);
    v=root(v);
    if (u==v)
        return 0;
    par[v]=u;
    return 1;
}
vector<int>cur;
bool w;
void dfs(int u,int p=-1)
{
    if (w)
        cur.push_back(u);
    pr[u]=p;
    for (auto i:nei[u])
    {
        if (i==p) continue;
        h[i]=h[u]+1;
        dfs(i,u);
        cur.push_back(u);
    }
    if (nei[u].size()==1&&u!=1)
        w=1;
    cur.push_back(-u);
}
vector<vector<int>> create_map(int N, int M, vector<int> A, vector<int> B) 
{
    if (N==1)
    {
        return {{1}};
    }
    w=0;
    cur={};
    for (int i=1;i<=N;i++)
    {
        nei[i]={};
        par[i]=i;
    }
    for (int i=0;i<M;i++)
    {
        rel[A[i]].insert(B[i]);
        rel[B[i]].insert(A[i]);
        if (merge(A[i],B[i]))
        {
            nei[A[i]].push_back(B[i]);
            nei[B[i]].push_back(A[i]);
        }
    }
    h[1]=0;
    dfs(1);
    int sz=cur.size();
    pr[1]=1;
    vector<vector<int>>ans;
    for (int j=0;j<sz;j++)
    {
        vector<int>z;
        int i=cur[j];
        if (i<0)
        {
            bool w=0;
            if (ans.size())
            {
                int pr=abs(cur[j-1]);
                if (ans.back()[0]==pr)
                    w=0;
                else
                    w=1;   
                if (pr==-i)
                    w=1-w;
            }
            for (auto j:rel[-i])
            {
                if (w)
                {
                    z.push_back(j);
                    z.push_back(-i);
                }
                else
                {
                    z.push_back(-i);
                    z.push_back(j);
                }
            }
            while (z.size()<sz)
                z.push_back((z.size()%2==w)?-i:pr[-i]);
        }
        else
        {
            bool w=0;
            int pr=abs(cur[j-1]);
            if (ans.size())
            {
                if (ans.back()[0]==pr)
                    w=0;
                else
                    w=1;   
            }
            for (int j=0;j<sz;j++)
            {
                z.push_back((j%2==w?i:pr));
            }
        }
        ans.push_back(z);
    }
    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...