Submission #1278651

#TimeUsernameProblemLanguageResultExecution timeMemory
1278651thieunguyenhuyAmusement Park (JOI17_amusement_park)C++20
10 / 100
22 ms2404 KiB
#ifndef hwe #include "Joi.h" #endif #include <bits/stdc++.h> using namespace std; #define POPCOUNT(n) (__builtin_popcountll((n))) #define CLZ(n) (__builtin_clzll((n))) #define CTZ(n) (__builtin_ctzll((n))) #define LOG(n) (63 - __builtin_clzll((n))) #define BIT(n, i) (((n) >> (i)) & 1ll) #define MASK(i) (1ll << (i)) #define FLIP(n, i) ((n) ^ (1ll << (i))) #define ON(n, i) ((n) | MASK(i)) #define OFF(n, i) ((n) & ~MASK(i)) #define Int __int128 #define fi first #define se second typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<int, int> pii; typedef pair<long long, long long> pll; typedef pair<long long, int> pli; typedef pair<int, long long> pil; typedef vector<pair<int, int>> vii; typedef vector<pair<long long, long long>> vll; typedef vector<pair<long long, int>> vli; typedef vector<pair<int, long long>> vil; template <class T1, class T2> bool maximize(T1 &x, T2 y) { if (x < y) { x = y; return true; } return false; } template <class T1, class T2> bool minimize(T1 &x, T2 y) { if (x > y) { x = y; return true; } return false; } template <class T> void remove_duplicate(vector<T> &ve) { sort (ve.begin(), ve.end()); ve.resize(unique(ve.begin(), ve.end()) - ve.begin()); } const int N = 1e6 + 5, LG = 60; const int MOD = 1e9 + 7; const int inf = 1e9; const long long INF = 1e18; #ifdef hwe void MessageBoard(int u, int msg) { cerr << "message " << u << ' ' << msg << endl; } #endif namespace JOI { int info[N], dep[N]; vector<int> adj[N], order; bitset<N> vis; void dfs(int u) { order.emplace_back(u); vis[u] = true; for (auto v : adj[u]) if (!vis[v]) { dep[v] = dep[u] + 1; dfs(v); } } void Joi(int n, int m, int a[], int b[], ll X, int subtask) { for (int i = 0; i < m; ++i) { adj[a[i]].emplace_back(b[i]); adj[b[i]].emplace_back(a[i]); } order.clear(); dfs(0); if (*max_element(dep, dep + n) + 1 >= LG) { for (int i = 0; i < n; ++i) MessageBoard(i, BIT(X, dep[i] % LG)); return; } vector<int> ve, state(n, 0); // state[i]: 0: not visited, 1: activated, 2: deleted for (int i = 0; i < LG; ++i) { info[order[i]] = i; state[order[i]] = 1, ve.emplace_back(order[i]); } for (int i = LG; i < n; ++i) { state[order[i]] = 1, ve.emplace_back(order[i]); for (int j = 0; j < ve.size(); ++j) { int u = ve[j], cnt = 0; for (auto v : adj[u]) cnt += (state[v] != 2); if (cnt > 1) continue; // this is a leaf in the component info[order[i]] = info[u], state[u] = 2; ve.erase(ve.begin() + j); break; } } for (int i = 0; i < n; ++i) cerr << info[i] << ' '; cerr << '\n'; for (int i = 0; i < n; ++i) MessageBoard(i, BIT(X, info[i])); } } void Joi(int n, int m, int a[], int b[], ll X, int subtask) { JOI::Joi(n, m, a, b, X, subtask); } #ifdef hwe int a[N], b[N]; signed main() { int n, m; cin >> n >> m; ll X; cin >> X; for (int i = 0; i < m; ++i) cin >> a[i] >> b[i]; Joi(n, m, a, b, X, 0); return 0; } #endif
#include "Ioi.h" #include <bits/stdc++.h> using namespace std; using ll = long long; #define all(x) x.begin(), x.end() static vector<int> adj[10000], order; static int seen[10000], depth[10000], par[10000], idx[10000]; static ll X; static void dfs(int i) { seen[i] = true; order.emplace_back(i); for (int j: adj[i]) { if (seen[j]) continue; depth[j] = depth[par[j] = i] + 1; dfs(j); } } static void dfs2(int i) { seen[i] = false; for (int j: adj[i]) { if (seen[j] != 1) continue; X |= (ll) Move(j) << idx[j]; dfs2(j); Move(i); } } ll Ioi(int N, int M, int A[], int B[], int P, int V, int T) { while (M--) { adj[A[M]].emplace_back(B[M]); adj[B[M]].emplace_back(A[M]); } dfs(0); if (*max_element(depth, depth + N) >= 59) { if (depth[P] >= 59) { X = (ll) V << (depth[P] % 60); for (int i = 59; i--; P = par[P]) X |= (ll) Move(par[P]) << (depth[par[P]] % 60); return X; } X = V; while (P) X = Move(P = par[P]); for (int i = N; i--;) { if (depth[i] == 59) { order = {i}; while (order.back()) order.emplace_back(par[order.back()]); reverse(all(order)); for (int i = 1; i < 60; ++i) X |= (ll) Move(order[i]) << i; return X; } } assert(false); } memset(seen, false, sizeof seen); vector<int> sub(order.begin(), order.begin() + 60); for (int i = 60; i--;) { seen[sub[i]] = true; idx[sub[i]] = i; } for (int i = 60; not seen[P]; ++i) { seen[order[i]] = true; for (int j: sub) { int cnt = 0; for (int k: adj[j]) cnt += seen[k] != 2; if (cnt > 1) continue; idx[order[i]] = idx[j]; sub.erase(find(all(sub), j)); seen[j] = 2; break; } sub.emplace_back(order[i]); } X = (ll) V << idx[P]; dfs2(P); 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...