Submission #51558

#TimeUsernameProblemLanguageResultExecution timeMemory
51558BrunoPloumhansAmusement Park (JOI17_amusement_park)C++14
10 / 100
39 ms5776 KiB
#include "Joi.h" #include <bits/stdc++.h> using namespace std; #define int long long struct UnionFind { vector<int> p, ranks; UnionFind(int n) : p(n), ranks(n, 0) { for(int i = 0; i < n; ++i) { p[i] = i; } } int find_set(int a) { return p[a] == a ? a : p[a] = find_set(p[a]); } bool is_same_set(int a, int b) { return find_set(a) == find_set(b); } void unite(int a, int b) { int x = find_set(a), y = find_set(b); if(x != y) { if(ranks[x] > ranks[y]) p[y] = x; else { p[x] = y; if(ranks[x] == ranks[y]) { ++ranks[y]; } } } } }; static vector<vector<int>> adj; static int tim = 0; static vector<int> ts; static vector<int> path; static void dfs(int u) { ts[u] = tim++; path.push_back(u); for(int v : adj[u]) { if(ts[v] == -1) { dfs(v); path.push_back(u); } } } static void find_tree(int n, int m, signed A[], signed B[]) { adj.resize(n); UnionFind uf(n); vector<pair<int, int>> edges(m); for(int i = 0; i < m; ++i) { edges[i] = {min(A[i], B[i]), max(A[i], B[i])}; } sort(edges.begin(), edges.end()); for(pair<int, int> p : edges) { int u = p.first, v = p.second; if(!uf.is_same_set(u, v)) { uf.unite(u, v); adj[u].push_back(v); adj[v].push_back(u); } } ts.assign(n, -1); dfs(0); /*cout << "ts: { "; for(int i = 0; i < n; ++i) { cout << ts[i] << ", "; } cout << "}\n"; cout << "path: { "; for(int i : path) { cout << i << ", "; } cout << "}" << endl;*/ } void Joi(signed n, signed m, signed A[], signed B[], long long X, signed T) { int seq[60]; //cout << "seq: { "; for(int i = 0; i < 60; ++i) { seq[i] = ((X&(1LL << i)) > 0); //cout << seq[i] << ", "; } //cout << "}" << endl; find_tree(n, m, A, B); for(int i = 0; i < n; ++i) { assert(ts[i] != -1); MessageBoard(i, seq[ts[i]%60]); } }
#include "Ioi.h" #include <bits/stdc++.h> using namespace std; #define int long long struct UnionFind { vector<int> p, ranks; UnionFind(int n) : p(n), ranks(n, 0) { for(int i = 0; i < n; ++i) { p[i] = i; } } int find_set(int a) { return p[a] == a ? a : p[a] = find_set(p[a]); } bool is_same_set(int a, int b) { return find_set(a) == find_set(b); } void unite(int a, int b) { int x = find_set(a), y = find_set(b); if(x != y) { if(ranks[x] > ranks[y]) p[y] = x; else { p[x] = y; if(ranks[x] == ranks[y]) { ++ranks[y]; } } } } }; static vector<vector<int>> adj; static int tim = 0; static vector<int> ts; static vector<int> path; static void dfs(int u) { ts[u] = tim++; path.push_back(u); for(int v : adj[u]) { if(ts[v] == -1) { dfs(v); path.push_back(u); } } } static void find_tree(int n, int m, signed A[], signed B[]) { adj.resize(n); UnionFind uf(n); vector<pair<int, int>> edges(m); for(int i = 0; i < m; ++i) { edges[i] = {min(A[i], B[i]), max(A[i], B[i])}; } sort(edges.begin(), edges.end()); for(pair<int, int> p : edges) { int u = p.first, v = p.second; if(!uf.is_same_set(u, v)) { uf.unite(u, v); adj[u].push_back(v); adj[v].push_back(u); } } ts.assign(n, -1); dfs(0); } long long Ioi(signed n, signed m, signed A[], signed B[], signed p, signed v, signed T) { find_tree(n, m, A, B); int seq[60]; seq[ts[p]%60] = v; int i; for(i = 0; i < n; ++i) { if(path[i] == p) { break; } } for(int k = 0; k < 120; ++k) { i = (i+1)%(path.size()-1); int res = Move(path[i]); seq[ts[path[i]]%60] = res; } int X = 0; for(int j = 0; j < 60; ++j) X |= seq[j] << j; return X; }
#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...