제출 #642512

#제출 시각아이디문제언어결과실행 시간메모리
642512Tenis0206Speedrun (RMI21_speedrun)C++17
0 / 100
390 ms748 KiB
#include <bits/stdc++.h>

//#define home

#ifndef home

#include "speedrun.h"

#endif // home

using namespace std;

#ifdef home

int nn;
int aa[100005],bb[100005];

int mask[100005];

int cnod;

bool sel[100005];

void setHintLen(int l)
{
    return;
}

void setHint(int i, int j, bool b)
{
    if(b)
    {
        mask[i] += (1<<j);
    }
}

int getLength()
{
    return 0;
}

bool getHint(int b)
{
    return ((mask[cnod] & (1<<b)) != 0);
}

bool goTo(int x)
{
    for(int i=1;i<nn;i++)
    {
        if(aa[i]==x && bb[i]==cnod)
        {
            cnod = x;
            sel[cnod] = true;
            return true;
        }
        if(aa[i]==cnod && bb[i]==x)
        {
            cnod = x;
            sel[cnod] = true;
            return true;
        }
    }
    return false;
}

#endif // home

int l[1005],t[1005];

vector<int> G[1005];

int poz = 0;

void dfs(int nod, int dad = 0)
{
    l[++poz] = nod;
    for(auto it : G[nod])
    {
        if(it==dad)
        {
            continue;
        }
        t[it] = nod;
        dfs(it,nod);
    }
}

void setDad(int nod, int dad)
{
    for(int b=0;b<10;b++)
    {
        bool val = ((dad & (1<<b)) != 0);
        setHint(nod,b+1,val);
    }
}

void setNext(int nod, int next)
{
    for(int b=0;b<10;b++)
    {
        bool val = ((next & (1<<b)) != 0);
        setHint(nod,b+11,val);
    }
}

void assignHints(int subtask, int n, int a[], int b[])
{
    setHintLen(20);
    for(int i=1;i<n;i++)
    {
        G[a[i]].push_back(b[i]);
        G[b[i]].push_back(a[i]);
    }
    dfs(1);
    for(int i=1;i<=n;i++)
    {
        setDad(l[i],t[i]);
        setNext(l[i],l[i+1]);
    }
}

int getDad(int nod)
{
    int rez = 0;
    for(int b=0;b<10;b++)
    {
        int val = getHint(b + 1);
        rez += val * (1<<b);
    }
    return rez;
}

int getNext(int nod)
{
    int rez = 0;
    for(int b=0;b<10;b++)
    {
        int val = getHint(b + 11);
        rez += val * (1<<b);
    }
    return rez;
}

void speedrun(int subtask, int n, int start)
{
    getLength();
    int nod = start;
    while(nod!=1)
    {
        int dad = getDad(nod);
        goTo(dad);
        nod = dad;
    }
    for(int i=1;i<n;i++)
    {
        int next = getNext(nod);
        bool ok = goTo(next);
        while(!ok)
        {
            int dad = getDad(nod);
            goTo(dad);
            nod = dad;
            ok = goTo(next);
        }
    }
}

#ifdef home

int main()
{
    freopen("nr.in","r",stdin);
    freopen("nr.out","w",stdout);
    cin>>nn;
    for(int i=1;i<nn;i++)
    {
        cin>>aa[i]>>bb[i];
    }
    assignHints(0,nn,aa,bb);
    cin>>cnod;
    sel[cnod] = true;
    speedrun(0,nn,cnod);
    bool ok = true;
    for(int i=1;i<=nn;i++)
    {
        ok &= sel[i];
    }
    if(ok)
    {
        cout<<"BRAVO BOSS";
    }
    else
    {
        cout<<"MECI MAI COX";
    }
    return 0;
}

#endif // home
#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...