답안 #646630

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
646630 2022-09-30T10:51:52 Z ksu2009en Speedrun (RMI21_speedrun) C++17
48 / 100
102 ms 796 KB
#include "speedrun.h"
#include <iostream>
#include <vector>
#include <string>
#include <math.h>
#include <cmath>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <bitset>
#include <cstring>

using namespace std;

void assignHints(int subtask, int n, int a[], int b[]) { /* your solution here */
    if(subtask == 1){
        setHintLen(n);
        for(int i = 1; i < n; i++){
            setHint(a[i], b[i], 1);
            setHint(b[i], a[i], 1);
        }
    }
    else if(subtask == 2){
        int center = 0;
        map<int, int> mp;
        for(int i = 1; i < n; i++)
            mp[a[i]]++, mp[b[i]]++;
        
        int mx = 0;
        for(auto i: mp)
            if(i.second > mx){
                mx = i.second;
                center = i.first;
            }
        
        setHintLen(20);

        for(int i = 1; i <= n; i++){
            if(i == center)
                continue;
            
            for(int j = 0; j < 20; j++){
                if((center >> j) % 2 != 0){
                    setHint(i, j + 1, 1);
                }
            }
        }
        
    }
    else if(subtask == 3){
        setHintLen(20);
        
        for(int i = 1; i <= n; i++){
            vector<int>nodes;
            for(int j = 1; j < n; j++){
                if(a[j] == i || b[j] == i){
                    int other = 0;
                    if(a[j] == i)
                        other = b[j];
                    else
                        other = a[j];
                    
                    nodes.push_back(other);
                }
            }
            if(!nodes.empty())
                for(int j = 0; j < 10; j++)
                    if((nodes[0] >> j) % 2 != 0)
                        setHint(i, j + 1, 1);
            
            if(nodes.size() >= 2){
                for(int j = 10; j < 20; j++)
                    if((nodes[1] >> (j - 10)) % 2 != 0)
                        setHint(i, j + 1, 1);
            }
            
        }
    }
}

bool used[1007];

void dfs(int v, int par, int &n){
    used[v] = true;
    for(int i = 1; i <= n; i++){
        if(!used[i] && getHint(i)){
            goTo(i);
            dfs(i, v, n);
        }
    }
    if(par != -1)
        goTo(par);
}

void dfs_3(int v, int par){
    //cout << v << endl;
    used[v] = true;
    
    int v1 = 0, v2 = 0;
    for(int i = 9; i >= 0; i--){
        v1 *= 2;
        if(getHint(i + 1))
            v1++;
    }
    
    for(int i = 19; i >= 10; i--){
        v2 *= 2;
        if(getHint(i + 1))
            v2++;
    }
    
    //cout << v1 << ' ' << v2 << endl;
    
    if(!used[v1] && v1 != 0){
        goTo(v1);
        dfs_3(v1, v);
    }
    if(!used[v2] && v2 != 0){
        goTo(v2);
        dfs_3(v2, v);
    }
    if(par != -1)
        goTo(par);
}

void speedrun(int subtask, int n, int start) { /* your solution here */
    if(subtask == 1){
        dfs(start, -1, n);
    }
    else if(subtask == 2){
        bool ok = false;
        for(int i = 1; i <= 20; i++)
            if(getHint(i))
                ok = true;
        
        int center = 0;
        if(ok){
            for(int j = 19; j >= 0; j--){
                center *= 2;
                if(getHint(j + 1)){
                    center++;
                }
            }
            
            goTo(center);
        }
        else
            center = start;
        
        
        for(int i = 1; i <= n; i++){
            if(i != start && i != center){
                goTo(i);
                goTo(center);
            }
        }
    }
    else{
        dfs_3(start, -1);
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 796 KB Output is correct
2 Correct 36 ms 788 KB Output is correct
3 Correct 35 ms 768 KB Output is correct
4 Correct 39 ms 748 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 672 KB Output is correct
2 Correct 36 ms 684 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 91 ms 672 KB Output is correct
2 Correct 102 ms 672 KB Output is correct
3 Correct 88 ms 712 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 336 KB setHintLen was never called
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 336 KB setHintLen was never called
2 Halted 0 ms 0 KB -