제출 #1333420

#제출 시각아이디문제언어결과실행 시간메모리
1333420a.pendov항공 노선도 (JOI18_airline)C++20
100 / 100
895 ms73492 KiB
#include "Alicelib.h"
#include <bits/stdc++.h>
using namespace std;

vector<pair<int,int>> reb;

void Alice( int N, int M, int A[], int B[])
{
    for(int i=0;i<M;i++)reb.push_back({A[i],B[i]});
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<10;j++)
        {
            if(i&(1LL<<j))reb.push_back({i,N+j});
        }
    }

    for(int i=0;i<9;i++)reb.push_back({N+i,N+i+1});

    for(int i=0;i<N+10;i++)reb.push_back({N+10,i});

    for(int i=0;i<10;i++)reb.push_back({N+i,N+11});

    InitG(N+12,reb.size());

    for(int i=0;i<reb.size();i++)
    {
        MakeG(i,reb[i].first,reb[i].second);
    }
}
#include "Boblib.h"
#include <bits/stdc++.h>
using namespace std;

unordered_set<int> edg[2000];
long long realVal[2000];
set<pair<int,int>> realReb;

pair<int,int> form(pair<int,int> a)
{
    if(a.first>a.second)return a;
    swap(a.first,a.second);
    return a;
}

void Bob( int V, int U, int C[], int D[] )
{
    for(int i=0;i<U;i++)
    {
        edg[C[i]].insert(D[i]);
        edg[D[i]].insert(C[i]);
    }

    int VS,BIN;
    vector<int> BINNUM;

    for(int i=0;i<V;i++)
    {
        if(edg[i].size()==V-2)VS=i;
    }

    for(int i=0;i<V;i++)
    {
        if(i!=VS&&edg[VS].find(i)==edg[VS].end())BIN=i;
    }


    for(auto i:edg[BIN])BINNUM.push_back(i);

    sort(BINNUM.begin(),BINNUM.end());
    //cout<<BINNUM.size()<<endl;

    do
    {
        bool flag=1;
        for(int i=0;i<9;i++)
        {
            //cout<<i<<endl;
            if(edg[BINNUM[i]].find(BINNUM[i+1])==edg[BINNUM[i]].end())flag=0;
        }
        if(flag)break;
    }while(next_permutation(BINNUM.begin(),BINNUM.end()));

    if(edg[BINNUM[0]].size()<edg[BINNUM[9]].size())reverse(BINNUM.begin(),BINNUM.end());

    for(auto i:BINNUM)realVal[i]=-1;
    realVal[BIN]=-1;
    realVal[VS]=-1;

    for(int i=0;i<10;i++)
    {
        for(auto j:edg[BINNUM[i]])
        {
            if(realVal[j]!=-1)realVal[j]+=(1LL<<i);
        }
    }
    int N=0;
    for(int i=0;i<V;i++)
    {
        if(realVal[i]==-1)continue;
        N++;
        for(auto j:edg[i])
        {
            if(realVal[j]==-1)continue;
            realReb.insert(form({realVal[i],realVal[j]}));
        }
    }

    InitMap(N,realReb.size());

    for(auto i:realReb)MakeMap(i.first,i.second);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...