Submission #107131

#TimeUsernameProblemLanguageResultExecution timeMemory
107131szawinisAmusement Park (JOI17_amusement_park)C++17
18 / 100
41 ms4904 KiB
#include "Joi.h" #include <bits/stdc++.h> using namespace std; const int N = 1e4+1; void dfs(int u, vector<vector<int> > &g, vector<int> &pre, int &tick, long long X) { pre[u] = ++tick; for(int v: g[u]) { if(pre[v]) continue; dfs(v, g, pre, tick, X); } MessageBoard(u, X >> ((pre[u] - 1) % 60) & 1); } void Joi(int n, int m, int A[], int B[], long long X, int T) { vector<vector<int> > g(n + 1); vector<int> pre(n + 1); int tick = 0; for(int i = 0; i < m; i++) { g[A[i]].push_back(B[i]); g[B[i]].push_back(A[i]); } dfs(0, g, pre, tick, X); }
#include "Ioi.h" #include <bits/stdc++.h> using namespace std; const int N = 1e4+1; void dfs(int u, vector<vector<int> > &g, vector<int> &d, vector<int> &par, vector<int> &pre, vector<int>& rev, int &tick) { pre[u] = ++tick; for(int v: g[u]) { if(pre[v]) continue; d[v] = d[u] + 1; par[v] = u; dfs(v, g, d, par, pre, rev, tick); } // cerr << u << ' ' << pre[u] << endl; } int get_lca(int u, int v, vector<int> &d, vector<int> &par) { if(d[u] < d[v]) swap(u, v); while(d[u] > d[v]) u = par[u]; while(u != v) { u = par[u]; v = par[v]; } return u; } long long moveToNext(int u, int v, vector<int> &d, vector<int> &par) { int org_u = u, org_v = v; int lca = get_lca(u, v, d, par); // cerr << "Ioi_moveToNext " << u <<' ' << v << ' ' << lca << endl; vector<int> ord1, ord2; while(u != lca) { ord1.push_back(u); u = par[u]; } while(v != lca) { ord2.push_back(v); v = par[v]; } vector<int> ord = ord1; ord.push_back(lca); for(int i = ord2.size() - 1; i >= 0; i--) ord.push_back(ord2[i]); ord.erase(ord.begin()); assert(ord.back() == org_v); // for(int x: ord) cerr << x << ' '; // cerr << endl; int ret = -1; for(int x: ord) ret = Move(x); return ret; } long long Ioi(int n, int m, int A[], int B[], int P, int V, int T) { vector<vector<int> > g(n + 1); vector<int> d(n + 1), par(n + 1), pre(n + 1), rev(n + 1); int tick = 0; for(int i = 0; i < m; i++) { g[A[i]].push_back(B[i]); g[B[i]].push_back(A[i]); } dfs(0, g, d, par, pre, rev, tick); for(int i = 0; i < n; i++) { --pre[i]; rev[pre[i]] = i; // cerr << "Ioi_pre " << i << ' ' << pre[i] << endl; } // for(int i = 0; i < n; i++) { // cerr << "Ioi_rev " << i << ' ' << rev[i] << endl; // } long long ret = 1ll * V << pre[P] % 60; int curr = P; for(int step = 1; step < 60; step++) { int pos = (pre[P] + step) % 60; int nxt = rev[pre[P] + step < n ? pre[P] + step : (pre[P] + step) % 60]; assert(0 <= curr && curr < n && 0 <= nxt && nxt < n && curr != nxt); assert(pos == pre[nxt] % 60); // cerr << "Ioi_iterate " << nxt << ' ' << pre[nxt] % 60 << endl; ret += moveToNext(curr, nxt, d, par) << pos; curr = nxt; } // cerr << ret << endl; return ret; }

Compilation message (stderr)

Ioi.cpp: In function 'long long int moveToNext(int, int, std::vector<int>&, std::vector<int>&)':
Ioi.cpp:28:9: warning: unused variable 'org_u' [-Wunused-variable]
     int org_u = u, org_v = v;
         ^~~~~
#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...