Submission #1091637

#TimeUsernameProblemLanguageResultExecution timeMemory
1091637marvinthangSpy 3 (JOI24_spy3)C++17
92 / 100
52 ms5128 KiB
/************************************* * author: marvinthang * * created: 21.03.2024 16:27:06 * *************************************/ #include "Aoi.h" #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define left ___left #define right ___right #define TIME (1.0 * clock() / CLOCKS_PER_SEC) #define MASK(i) (1LL << (i)) #define BIT(x, i) ((x) >> (i) & 1) #define __builtin_popcount __builtin_popcountll #define ALL(v) (v).begin(), (v).end() #define REP(i, n) for (int i = 0, _n = (n); i < _n; ++i) #define REPD(i, n) for (int i = (n); i-- > 0; ) #define FOR(i, a, b) for (int i = (a), _b = (b); i < _b; ++i) #define FORD(i, b, a) for (int i = (b), _a = (a); --i >= _a; ) #define FORE(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i) #define FORDE(i, b, a) for (int i = (b), _a = (a); i >= _a; --i) #define scan_op(...) istream & operator >> (istream &in, __VA_ARGS__ &u) #define print_op(...) ostream & operator << (ostream &out, const __VA_ARGS__ &u) #ifdef LOCAL #include "debug.h" #else #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); } #define DB(...) 23 #define db(...) 23 #define debug(...) 23 #endif template <class U, class V> scan_op(pair <U, V>) { return in >> u.first >> u.second; } template <class T> scan_op(vector <T>) { for (size_t i = 0; i < u.size(); ++i) in >> u[i]; return in; } template <class U, class V> print_op(pair <U, V>) { return out << '(' << u.first << ", " << u.second << ')'; } template <size_t i, class T> ostream & print_tuple_utils(ostream &out, const T &tup) { if constexpr(i == tuple_size<T>::value) return out << ")"; else return print_tuple_utils<i + 1, T>(out << (i ? ", " : "(") << get<i>(tup), tup); } template <class ...U> print_op(tuple<U...>) { return print_tuple_utils<0, tuple<U...>>(out, u); } template <class Con, class = decltype(begin(declval<Con>()))> typename enable_if <!is_same<Con, string>::value, ostream&>::type operator << (ostream &out, const Con &con) { out << '{'; for (__typeof(con.begin()) it = con.begin(); it != con.end(); ++it) out << (it == con.begin() ? "" : ", ") << *it; return out << '}'; } // end of template namespace { template <class A, class B> bool minimize(A &a, B b) { return a > b ? a = b, true : false; } const long long INF = 1e18; } string aoi(int N, int M, int Q, int K, vector <int> A, vector <int> B, vector <long long> C, vector <int> T, vector <int> X) { vector <vector <int>> adj(N); REP(i, M) { adj[A[i]].push_back(i); adj[B[i]].push_back(i); } priority_queue <pair <long long, int>, vector <pair <long long, int>>, greater <pair <long long, int>>> pq; vector <long long> dist(N, INF); vector <int> par(N, -1); pq.emplace(dist[0] = 0, 0); while (!pq.empty()) { auto [du, u] = pq.top(); pq.pop(); if (du != dist[u]) continue; for (int i: adj[u]) { int v = A[i] ^ B[i] ^ u; if (minimize(dist[v], du + C[i])) { pq.emplace(dist[v], v); par[v] = i; } } } vector <int> lost_roads(M, -1), in_query(N, -1); REP(i, K) lost_roads[X[i]] = i; REP(i, Q) in_query[T[i]] = i; REP(i, N) adj[i].clear(); FOR(i, 1, N) adj[A[par[i]] ^ B[par[i]] ^ i].push_back(par[i]); vector <int> nodes(K, -1); vector <int> pid(Q, -1); auto dfs = [&] (auto &&self, int u) -> int { vector <int> child; for (int i: adj[u]) { int v = self(self, A[i] ^ B[i] ^ u); if (v == -1) continue; child.push_back(v); if (lost_roads[i] != -1) nodes[lost_roads[i]] = v; } if ((int) child.size() >= 2 && in_query[u] == -1) { in_query[u] = pid.size(); pid.push_back(-1); } if (in_query[u] != -1) { for (int v: child) pid[v] = in_query[u]; return in_query[u]; } return child.empty() ? -1 : child[0]; }; dfs(dfs, 0); string res; int sz = pid.size(); int lg = __lg(sz) + 1; vector <bool> is_leaf(sz, true); REP(i, sz) if (pid[i] != -1) is_leaf[pid[i]] = false; if (Q == 1) is_leaf[0] = false; vector <int> id(sz, -1); int cl = 0; REP(i, sz) if (!is_leaf[i]) id[i] = cl++; int lg2 = __lg(cl) + 1; REP(i, Q) res += char('0' + is_leaf[i]); REP(i, sz) { if (pid[i] == -1) pid[i] = cl; else pid[i] = id[pid[i]]; REP(j, lg2) res += char('0' + BIT(pid[i], j)); } REP(i, K) { if (nodes[i] == -1) nodes[i] = sz; REP(j, lg) res += char('0' + BIT(nodes[i], j)); } return res; }
/************************************* * author: marvinthang * * created: 21.03.2024 16:32:33 * *************************************/ #include "Bitaro.h" #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define left ___left #define right ___right #define TIME (1.0 * clock() / CLOCKS_PER_SEC) #define MASK(i) (1LL << (i)) #define BIT(x, i) ((x) >> (i) & 1) #define __builtin_popcount __builtin_popcountll #define ALL(v) (v).begin(), (v).end() #define REP(i, n) for (int i = 0, _n = (n); i < _n; ++i) #define REPD(i, n) for (int i = (n); i-- > 0; ) #define FOR(i, a, b) for (int i = (a), _b = (b); i < _b; ++i) #define FORD(i, b, a) for (int i = (b), _a = (a); --i >= _a; ) #define FORE(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i) #define FORDE(i, b, a) for (int i = (b), _a = (a); i >= _a; --i) #define scan_op(...) istream & operator >> (istream &in, __VA_ARGS__ &u) #define print_op(...) ostream & operator << (ostream &out, const __VA_ARGS__ &u) #ifdef LOCAL #include "debug.h" #else #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); } #define DB(...) 23 #define db(...) 23 #define debug(...) 23 #endif template <class U, class V> scan_op(pair <U, V>) { return in >> u.first >> u.second; } template <class T> scan_op(vector <T>) { for (size_t i = 0; i < u.size(); ++i) in >> u[i]; return in; } template <class U, class V> print_op(pair <U, V>) { return out << '(' << u.first << ", " << u.second << ')'; } template <size_t i, class T> ostream & print_tuple_utils(ostream &out, const T &tup) { if constexpr(i == tuple_size<T>::value) return out << ")"; else return print_tuple_utils<i + 1, T>(out << (i ? ", " : "(") << get<i>(tup), tup); } template <class ...U> print_op(tuple<U...>) { return print_tuple_utils<0, tuple<U...>>(out, u); } template <class Con, class = decltype(begin(declval<Con>()))> typename enable_if <!is_same<Con, string>::value, ostream&>::type operator << (ostream &out, const Con &con) { out << '{'; for (__typeof(con.begin()) it = con.begin(); it != con.end(); ++it) out << (it == con.begin() ? "" : ", ") << *it; return out << '}'; } // end of template namespace { template <class A, class B> bool minimize(A &a, B b) { return a > b ? a = b, true : false; } const long long INF = 1e18; } void bitaro(int N, int M, int Q, int K, vector<int> A, vector<int> B, vector<long long> C, vector<int> T, vector<int> X, string s) { vector <vector <int>> adj(N); REP(i, M) { adj[A[i]].push_back(i); adj[B[i]].push_back(i); } int t = 0; vector <bool> is_leaf(Q, true); REP(i, Q) if (s[t++] == '0') is_leaf[i] = false; int num_leaf = count(ALL(is_leaf), true); int lg = 0, lg2 = -1, sz = 0; while (lg2 == -1) { ++lg; int x = (int) s.size() - t - K * lg; FORE(i, 1, lg) if (x % i == 0) { int v = x / i; if (num_leaf <= v && v < MASK(lg) && __lg(v - num_leaf) + 1 == i) { lg2 = i; sz = v; break; } } } vector <int> nd; REP(i, sz) if (i >= Q || !is_leaf[i]) nd.push_back(i); nd.push_back(-1); vector <int> par(sz), nodes(K); REP(i, sz) { int x = 0; REP(j, lg2) if (s[t++] == '1') x |= MASK(j); par[i] = nd[x]; } REP(i, K) REP(j, lg) if (s[t++] == '1') nodes[i] |= MASK(j); vector <vector <int>> child(sz); vector <int> tmask(sz + 1); int rt = -1; REP(i, sz) { if (par[i] == -1) rt = i; else child[par[i]].push_back(i); } auto dfs = [&] (auto &&self, int u) -> void { if (u < Q) tmask[u] = MASK(u); for (int v: child[u]) { self(self, v); tmask[u] |= tmask[v]; } }; dfs(dfs, rt); REP(t, Q) { REP(i, K) C[X[i]] = BIT(tmask[nodes[i]], t) ? 0 : INF; priority_queue <pair <long long, int>, vector <pair <long long, int>>, greater <pair <long long, int>>> pq; vector <long long> dist(N, INF); vector <int> trace(N, -1); pq.emplace(dist[0] = 0, 0); while (!pq.empty()) { auto [du, u] = pq.top(); pq.pop(); if (du != dist[u]) continue; for (int i: adj[u]) { int v = A[i] ^ B[i] ^ u; if (minimize(dist[v], du + C[i])) { pq.emplace(dist[v], v); trace[v] = i; } } } int u = T[t]; vector <int> res; while (u) { int i = trace[u]; res.push_back(i); u = A[i] ^ B[i] ^ u; } reverse(res.begin(), res.end()); answer(res); } }
#Verdict Execution timeMemoryGrader output
Fetching results...