제출 #923407

#제출 시각아이디문제언어결과실행 시간메모리
923407shoryu386Speedrun (RMI21_speedrun)C++17
60 / 100
3505 ms4784 KiB
#include "speedrun.h" #include <bits/stdc++.h> using namespace std; bool vis[1007]; int parset[1007]; vector<int> adj[1007]; vector<int> dorder[1007]; int n; void dfs(int x, int p, int d){ vis[x] = 1; parset[x] = p; dorder[d].push_back(x); for (auto y : adj[x]){ if (!vis[y]){ dfs(y, x, d+1); } } } void assignHints(int subtask, int N, int A[], int B[]) { /* your solution here */ setHintLen(20); for (int x = 1; x < N; x++){ adj[A[x]].push_back(B[x]); adj[B[x]].push_back(A[x]); } //let root be 1 always dfs(1, 0, 0); vector<int> inorder; for (int x = 0; x <= N; x++){ for (auto y : dorder[x]){ inorder.push_back(y); } } //data 1 is par //data 2 is next int next[N+1]; for (int x = 0; x < N-1; x++){ next[ inorder[x] ] = inorder[x+1]; } next[inorder[N-1]] = inorder[0]; //encryption for (int x = 1; x <= N; x++){ for (int z = 0; z <= 9; z++){ if (parset[x] & (1<<z)){ setHint(x, z+1, 1); } } for (int z = 0; z <= 9; z++){ if (next[x] & (1<<z)){ setHint(x, z+11, 1); } } } return; } int par[1007]; int nextt[1007]; int cur; #define WEIRD -23145 void setDetails(){ if (nextt[cur] != WEIRD) return; par[cur] = 0; nextt[cur] = 0; for (int z = 0; z <= 9; z++){ if (getHint(z+1)){ par[cur] += (1<<z); } } for (int z = 0; z <= 9; z++){ if (getHint(z+11)){ nextt[cur] += (1<<z); } } } inline void assertGoTo(int x){ goTo(x); } inline void returnToRoot(){ setDetails(); int steps = 0; while (cur != 1){ assertGoTo(par[cur]); cur = par[cur]; setDetails(); steps++; if (steps > 1500) assert(false); } } vector<int> moves[1007]; inline void trace(int x){ returnToRoot(); for (auto z : moves[x]){ assertGoTo(z); cur = z; } return; } void speedrun(int subtask, int N, int start) { /* your solution here */ cur = start; for (int x = 0; x < 1007; x++) par[x] = WEIRD; for (int x = 0; x < 1007; x++) nextt[x] = WEIRD; returnToRoot(); vector<int> inorder; inorder.push_back(1); int ptr = 0; int nodeCount = 1; int rounds = 0; for (int z = 0; z < N-1; z++){ int nextnode = nextt[inorder.back()]; if (nextnode == 0) break; trace(inorder[ptr]); while (!goTo(nextnode)){ ptr++; trace(inorder[ptr]); } nodeCount++; inorder.push_back(nextnode); cur = nextnode; moves[cur] = moves[inorder[ptr]]; moves[cur].push_back(cur); setDetails(); } }

컴파일 시 표준 에러 (stderr) 메시지

speedrun.cpp: In function 'void speedrun(int, int, int)':
speedrun.cpp:134:6: warning: unused variable 'rounds' [-Wunused-variable]
  134 |  int rounds = 0;
      |      ^~~~~~
#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...