Submission #1225476

#TimeUsernameProblemLanguageResultExecution timeMemory
1225476Ghulam_JunaidFloppy (RMI20_floppy)C++20
100 / 100
66 ms10612 KiB
#include <bits/stdc++.h> #include <stdlib.h> #include <string.h> #include "floppy.h" // #include "grader.cpp" using namespace std; const int MXN = 1e5 + 10, LG = 18; int n, sp[MXN][LG], par[MXN][LG], h[MXN], pos[MXN], tme, cur, lc[MXN], rc[MXN], rev[MXN]; vector<int> arr, order; string bits; int get(int l, int r){ int lg = 31 - __builtin_clz(r - l + 1); int i = sp[l][lg], j = sp[r - (1 << lg) + 1][lg]; if (arr[i] > arr[j]) return i; return j; } void dnc(int l, int r){ if (l > r) return ; int mx = get(l, r); if (l == mx) bits += '0'; else bits += '1'; if (mx == r) bits += '0'; else bits += '1'; dnc(l, mx - 1); dnc(mx + 1, r); } void read_array(int subtask_id, const vector<int> &v) { arr = v; n = arr.size(); for (int i = 0; i < n; i ++) sp[i][0] = i; for (int j = 1; j < LG; j ++){ for (int i = 0; i < n; i ++){ int nxt = i + (1 << (j - 1)); sp[i][j] = sp[i][j - 1]; if (nxt < n and arr[sp[i][j]] < arr[sp[nxt][j - 1]]) sp[i][j] = sp[nxt][j - 1]; } } dnc(0, n - 1); save_to_floppy(bits); } void dfs(int v){ for (int j = 1; j < LG; j ++) if (par[v][j - 1] != -1) par[v][j] = par[par[v][j - 1]][j - 1]; if (bits[2 * v] == '1'){ cur++; lc[v] = cur; par[cur][0] = v; h[cur] = h[v] + 1; dfs(cur); } rev[tme] = v; pos[v] = tme++; if (bits[2 * v + 1] == '1'){ cur++; rc[v] = cur; par[cur][0] = v; h[cur] = h[v] + 1; dfs(cur); } } int lca(int u, int v){ if (h[u] > h[v]) swap(u, v); int d = h[v] - h[u]; for (int i = 0; i < LG; i ++) if ((1 << i) & d) v = par[v][i]; if (u == v) return v; for (int i = LG - 1; i >= 0; i --) if (par[u][i] != par[v][i]) u = par[u][i], v = par[v][i]; return par[v][0]; } vector<int> solve_queries(int subtask_id, int nn, const string &ss, const vector<int> &a, const vector<int> &b) { bits = ss, n = nn; memset(par, -1, sizeof par); dfs(0); vector<int> answers; for (int i = 0; i < a.size(); i ++){ int l = a[i], r = b[i]; int u = rev[l], v = rev[r]; int L = lca(u, v); answers.push_back(pos[L]); } return answers; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...