Submission #646630

#TimeUsernameProblemLanguageResultExecution timeMemory
646630ksu2009enSpeedrun (RMI21_speedrun)C++17
48 / 100
102 ms796 KiB
#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); } }
#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...