답안 #1091989

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1091989 2024-09-22T19:02:42 Z alexdd Speedrun (RMI21_speedrun) C++17
0 / 100
3500 ms 1196 KB
#include "speedrun.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> con[1005];
int parent[1005];
void pune_hint(int nod, int x, int y)
{
    //cerr<<nod<<"  "<<x<<" & "<<y<<" hint\n";
    for(int i=0;i<10;i++)
    {
        if(((1<<i)&x))
            setHint(nod,i+1,1);
        if(((1<<i)&y))
            setHint(nod,i+11,1);
    }
}
void dfs(int nod, int par, int tori)
{
    parent[nod]=par;
    vector<int> v;
    for(int adj:con[nod])
        if(adj!=par)
            v.push_back(adj);
    for(int i=0;i<v.size();i++)
    {
        if(i+1 < v.size())
            dfs(v[i],nod,v[i+1]);
        else
            dfs(v[i],nod,0);
    }
    if(tori==0)
    {
        if(v.empty()) pune_hint(nod,parent[par],0);
        else pune_hint(nod,parent[par],v[0]);
    }
    else
    {
        if(v.empty()) pune_hint(nod,tori,0);
        else pune_hint(nod,tori,v[0]);
    }
}
void assignHints(int subtask, int N, int A[], int B[])
{
    setHintLen(20);
    for(int i=1;i<N;i++)
    {
        con[A[i]].push_back(B[i]);
        con[B[i]].push_back(A[i]);
    }
    dfs(1,0,0);
}
int get1()
{
    int aux=0;
    for(int i=0;i<10;i++)
        if(getHint(i+1))
            aux += (1<<i);
    return aux;
}
int get2()
{
    int aux=0;
    for(int i=0;i<10;i++)
        if(getHint(i+11))
            aux += (1<<i);
    return aux;
}
int nxt[1005],down[1005];
void dfs_speedrun(int nod, int par)
{
    //cerr<<nod<<" "<<par<<" dfs\n";
    nxt[nod] = get1();
    down[nod] = get2();
    if(down[nod]==0)///e frunza
    {
        if(par!=0) assert(goTo(par));
        return;
    }
    int c = down[nod];
    while(1)
    {
        assert(goTo(c));
        dfs_speedrun(c,nod);
        c = nxt[c];
        if(c==par)
            break;
    }
    if(par!=0) assert(goTo(par));
}
void speedrun(int subtask, int N, int start)
{
    if(N==1)
        return;
    int cur=start;
    while(1)
    {
        down[cur] = get2();
        if(down[cur]==0)
            break;
        assert(goTo(down[cur]));
        cur = down[cur];
    }
    int p=-1;
    for(int i=1;i<=N;i++)
    {
        if(i!=cur && goTo(i))
        {
            p=i;
            break;
        }
    }
    assert(p!=-1);
    ///suntem in p
    assert(goTo(cur));
    int it=0;
    while(cur!=1)
    {
        it++;
        if(it==100)
            break;
        //cerr<<cur<<" "<<p<<" zzz\n";
        nxt[cur] = get1();
        //cerr<<cur<<" "<<nxt[cur]<<" nxt\n";
        assert(goTo(p));
        if(p==1)
        {
            cur=1;
            break;
        }
        if(nxt[cur]==0 || !goTo(nxt[cur]))
        {
            swap(cur,p);
        }
        else
        {
            cur = nxt[cur];
        }
        //assert(goTo(nxt[cur]));
    }
    if(cur!=1) while(1);
    assert(cur==1);
    dfs_speedrun(1,0);
}
/**
5
1 2
2 3
3 4
3 5
4
*/

Compilation message

speedrun.cpp: In function 'void dfs(int, int, int)':
speedrun.cpp:24:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |     for(int i=0;i<v.size();i++)
      |                 ~^~~~~~~~~
speedrun.cpp:26:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   26 |         if(i+1 < v.size())
      |            ~~~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 936 KB Output is correct
2 Execution timed out 3598 ms 948 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3558 ms 684 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3594 ms 1196 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 60 ms 684 KB Output is correct
2 Correct 46 ms 684 KB Output is correct
3 Correct 30 ms 936 KB Output is correct
4 Execution timed out 3586 ms 696 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 53 ms 692 KB Output is correct
2 Correct 41 ms 868 KB Output is correct
3 Correct 47 ms 852 KB Output is correct
4 Execution timed out 3561 ms 896 KB Time limit exceeded
5 Halted 0 ms 0 KB -