#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 |
- |