Submission #1171741

#TimeUsernameProblemLanguageResultExecution timeMemory
1171741fryingducFloppy (RMI20_floppy)C++20
0 / 100
56 ms6564 KiB
#include <stdlib.h> #include <string.h> #include "floppy.h" #include "bits/stdc++.h" using namespace std; #ifdef duc_debug #include "bits/debug.h" #else #define debug(...) #endif const int maxn = 4e4 + 4; const int LG = 15; int n, st[maxn][LG + 1]; string send; vector<int> vl; void calc(int l, int r) { if (l > r) return; auto get = [&](int l, int r) { int p = 31 - __builtin_clz(r - l + 1); return vl[st[l][p]] > vl[st[r - (1 << p) + 1][p]] ? st[l][p] : st[r - (1 << p) + 1][p]; }; int mid = get(l, r); if (l <= mid - 1) { send += '1'; calc(l, mid - 1); } else { send += '0'; } if (mid + 1 <= r) { send += '1'; calc(mid + 1, r); } else { send += '0'; } } void read_array(int subtask_id, const vector<int> &_v) { vl = _v; n = (int)vl.size(); vl.insert(vl.begin(), 0); for (int i = 1; i <= n; ++i) { st[i][0] = i; } send = ""; for (int j = 1; j <= LG; ++j) { for (int i = 1; i + (1 << j) <= n + 1; ++i) { if (vl[st[i][j - 1]] > vl[st[i + (1 << (j - 1))][j - 1]]) { st[i][j] = st[i][j - 1]; } else { st[i][j] = st[i + (1 << (j - 1))][j - 1]; } } } calc(1, n); save_to_floppy(send); } int up[maxn][LG + 1]; int child[maxn][2]; int h[maxn]; int num_nodes; int id; int rv[maxn]; int tin[maxn]; int mx[maxn]; void build(int u) { for (int ite = 0; ite < 2; ++ite) { if (send[id] == '1') { ++num_nodes; ++id; child[u][ite] = num_nodes; h[num_nodes] = h[u] + 1; up[num_nodes][0] = u; for (int i = 1; i <= LG; ++i) { up[num_nodes][i] = up[up[num_nodes][i - 1]][i - 1]; } build(num_nodes); mx[u] = max(mx[u], mx[num_nodes] + 1); } else ++id; } } void construct(int u, int bl, int br) { int p = bl; if (child[u][0]) { p = mx[child[u][0]] + bl + 1; } tin[p] = u, rv[u] = p; if (child[u][0]) { construct(child[u][0], bl, p - 1); } if (child[u][1]) { construct(child[u][1], p + 1, br); } } int lca(int u, int v) { if (h[u] < h[v]) swap(u, v); for (int i = LG; i >= 0; --i) { if ((h[u] - h[v]) >> i & 1) { u = up[u][i]; } } if (u == v) return u; for (int i = LG; i >= 0; --i) { if (up[u][i] != up[v][i]) { u = up[u][i], v = up[v][i]; } } return up[v][0]; } vector<int> solve_queries(int subtask_id, int N, const string &bits, const vector<int> &a, const vector<int> &b) { send = bits; debug(send); n = N; for (int i = 1; i <= n; ++i) { h[i] = 0; } num_nodes = id = 0; build(++num_nodes); construct(1, 1, n); vector<int> res; // for (int i = 1; i <= n; ++i) { // debug(i, rv[i], child[i][0], child[i][1]); // } for (int i = 0; i < (int)a.size(); ++i) { res.push_back(rv[lca(tin[a[i] + 1], tin[b[i] + 1])] - 1); } debug(res); return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...