Submission #1278646

#TimeUsernameProblemLanguageResultExecution timeMemory
1278646thieunguyenhuyAmusement Park (JOI17_amusement_park)C++20
10 / 100
107 ms2420 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
#ifndef hwe #include "Ioi.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()); } mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); long long random(long long l, long long r) { return uniform_int_distribution<long long>(l, r)(rng); } unsigned long long random(unsigned long long l, unsigned long long r) { return uniform_int_distribution<unsigned long long>(l, r)(rng); } template <class T> T random(T r) { return rng() % r; } const int N = 1e6 + 5, LG = 60; const int MOD = 1e9 + 7; const int inf = 1e9; const long long INF = 1e18; #ifdef hwe int Move(int u) { return 1; } #endif namespace IOI { ll X = 0; int info[N], dep[N], par[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]) { par[v] = u, dep[v] = dep[u] + 1; dfs(v); } } void getAns(vector<int> &state, int u) { assert(state[u] == 1); state[u] = 0; for (auto v : adj[u]) if (state[v] == 1) { X |= (ll)Move(v) << info[v]; getAns(state, v); Move(u); } } void move(int P) { X |= (ll)Move(P) << info[P]; } ll Ioi(int n, int m, int a[], int b[], int P, int V, 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) info[i] = dep[i] % LG; X = (ll)V << info[P]; if (dep[P] >= LG) { for (int _ = 1; _ < LG; ++_) move(P = par[P]); return X; } while (info[P] != 0) move(P = par[P]); for (int _ = 1; _ < LG; ++_) { for (auto v : adj[P]) if (dep[v] == dep[P] + 1) { move(P = v); break; } } return X; } 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; state[P] == 0; ++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; } } X = (ll)V << info[P]; getAns(state, P); return X; } } ll Ioi(int n, int m, int a[], int b[], int P, int V, int subtask) { return IOI::Ioi(n, m, a, b, P, V, 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]; return 0; } #endif
#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...