Submission #205695

#TimeUsernameProblemLanguageResultExecution timeMemory
205695ArshiaDadrasAmusement Park (JOI17_amusement_park)C++14
45 / 100
46 ms7216 KiB
/* In the name of Allah */ #include<bits/stdc++.h> #include<Joi.h> using namespace std; const int N = 1e4 + 5; int n, m, k, a[N], b[N], root[N], down[N], sz[N], id[N]; vector<int> ed[N], adj[N]; bitset<N> mark; void dfs_tree(int u) { mark.set(u); vector<int> help; for (auto v: ed[u]) if (!mark[v]) { dfs_tree(v); help.push_back(v); } adj[u] = help; } void change(int u) { for (auto v: adj[u]) if (!~root[v]) { root[v] = root[u]; change(v); } } void go(int u) { id[u] = sz[root[u]]++; for (auto v: adj[u]) if (k + sz[root[u]] < 60) go(v); } void go_big(int u) { for (sz[u] = 0; !adj[u].empty(); u = adj[u][0]) { k = sz[adj[u][0]], id[u] = sz[root[u]]++; for (auto v: adj[u]) if (k + sz[root[u]] < 60 && v ^ adj[u][0]) go(v); } id[u] = sz[root[u]]++; } bool build(int u) { vector<int> help; sz[u] = 1, down[u] = 0; for (auto v: adj[u]) if (!build(v)) { sz[u] += sz[v]; help.push_back(v); down[u] = max(down[u], down[v] + 1); } sort(help.begin(), help.end(), [] (int u, int v) { return down[u] > down[v]; }); adj[u] = help; if (sz[u] < 60) return false; change(root[u] = u); return go_big(u), true; } bool set_root(int v) { for (int u = 0; u < n; u++) id[u] = root[u] = -1; mark.reset(), dfs_tree(v); return build(v); } void build_tree() { if (!set_root(0)) for (int i = 0; i < m; i++) { if (~root[a[i]]) swap(a[i], b[i]); if (!~root[a[i]] && ~root[b[i]]) { set_root(b[i]); break; } } } void Joi(int N, int M, int A[], int B[], long long X, int T) { n = N, m = M; for (int u = 0; u < n; u++) ed[u].clear(); for (int i = 0; i < m; i++) { ed[a[i] = A[i]].push_back(B[i]); ed[b[i] = B[i]].push_back(A[i]); } build_tree(); for (int u = 0; u < n; u++) MessageBoard(u, ~id[u]? X >> id[u] & 1: 0); }
/* In the name of Allah */ #include<bits/stdc++.h> #include<Ioi.h> using namespace std; const int N = 1e4 + 5; int n, m, k, a[N], b[N], root[N], down[N], sz[N], par[N], id[N]; vector<int> ed[N], adj[N], path[N]; bitset<N> mark; void dfs_tree(int u) { mark.set(u); vector<int> help; for (auto v: ed[u]) if (!mark[v]) { help.push_back(v); dfs_tree(v), par[v] = u; } adj[u] = help; } void change(int u) { for (auto v: adj[u]) if (!~root[v]) { root[v] = root[u]; change(v); } } void go(int u) { id[u] = sz[root[u]]++; path[root[u]].push_back(u); for (auto v: adj[u]) if (k + sz[root[u]] < 60) go(v), path[root[u]].push_back(u); } void go_big(int u) { for (sz[u] = 0; !adj[u].empty(); u = adj[u][0]) { path[root[u]].push_back(u); k = sz[adj[u][0]], id[u] = sz[root[u]]++; for (auto v: adj[u]) if (k + sz[root[u]] < 60 && v ^ adj[u][0]) go(v), path[root[u]].push_back(u); } id[u] = sz[root[u]]++; path[root[u]].push_back(u); } bool build(int u) { vector<int> help; sz[u] = 1, down[u] = 0; for (auto v: adj[u]) if (!build(v)) { sz[u] += sz[v]; help.push_back(v); down[u] = max(down[u], down[v] + 1); } sort(help.begin(), help.end(), [] (int u, int v) { return down[u] > down[v]; }); adj[u] = help; if (sz[u] < 60) return false; change(root[u] = u); return go_big(u), true; } bool set_root(int v) { for (int u = 0; u < n; u++) { id[u] = root[u] = -1; path[u].clear(); } mark.reset(), dfs_tree(v); return build(v); } void build_tree() { if (!set_root(0)) for (int i = 0; i < m; i++) { if (~root[a[i]]) swap(a[i], b[i]); if (!~root[a[i]] && ~root[b[i]]) { set_root(b[i]); break; } } } long long Ioi(int N, int M, int A[], int B[], int P, int V, int T) { n = N, m = M; for (int u = 0; u < n; u++) ed[u].clear(); for (int i = 0; i < m; i++) { ed[a[i] = A[i]].push_back(B[i]); ed[b[i] = B[i]].push_back(A[i]); } build_tree(); while (P ^ root[P]) V = Move(P = par[P]); long long answer = V; for (auto u: path[P]) { if (P ^ u) V = Move(P = u); answer |= 1LL * V << id[P]; } return answer; }
#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...