Submission #1219322

#TimeUsernameProblemLanguageResultExecution timeMemory
1219322damamilaFloppy (RMI20_floppy)C++20
100 / 100
424 ms5672 KiB
#include <bits/stdc++.h> using namespace std; //~ #define int long long string str; vector<int> num; vector<int> rev; int idx = 0; int cnt = 0; int over = 0; vector<vector<int>> jump; vector<int> dep; int logn = 16; int n; vector<int> arr; void save_to_floppy(const string &bits); //~ void save_to_floppy(const string &bits) { //~ return; //~ } void construct(int l, int r) { if (l >= r) return; pair<int, int> ans = {-2e9, -1}; for (int i = l; i < r; i++) { if (arr[i] > ans.first) { ans = {arr[i], i}; } } if (l != ans.second) str.push_back('1'); else str.push_back('0'); if (r-1 != ans.second) str.push_back('1'); else str.push_back('0'); construct(l, ans.second); construct(ans.second+1, r); } void read_array(int subtask_id, const vector<int> &v) { arr = v; construct(0, v.size()); //~ cout << str << endl; save_to_floppy(str); } void dfs(int p, int d) { int tmp = idx; idx += 2; int cnt2 = cnt; jump[0][cnt2] = p; dep[cnt2] = d; cnt++; if (str[tmp] == '1') { dfs(cnt2, d+1); } num[cnt2] = over; rev[over] = cnt2; over++; if (str[tmp+1] == '1') { dfs(cnt2, d+1); } } void pp() { for (int i = 1; i < logn; i++) { for (int j = 0; j < n; j++) { jump[i][j] = jump[i-1][jump[i-1][j]]; } } } int lift(int a, int d) { for (int i = 0; i < logn; i++) { if (d & (1<<i)) { a = jump[i][a]; } } return a; } int lca(int a, int b) { if (dep[b] > dep[a]) swap(a, b); a = lift(a, dep[a]-dep[b]); for (int i = logn-1; i >= 0; i--) { if (jump[i][a] != jump[i][b]) { a = jump[i][a]; b = jump[i][b]; } } if (a != b) { a = jump[0][a]; } return a; } std::vector<int> solve_queries(int subtask_id, int N, const std::string &bits, const std::vector<int> &a, const std::vector<int> &b) { str = bits; n = N; num = vector<int> (N, 0); rev = vector<int> (N, 0); dep = vector<int> (N, 0); jump = vector<vector<int>> (logn, vector<int> (N, 0)); dfs(-1, 0); //~ for (int i : num) cout << i << " "; //~ cout << endl; //~ for (int i : jump[0]) cout << i << " "; //~ cout << endl; pp(); vector<int> ans; for (int i = 0; i < (int)a.size(); i++) { int a1 = rev[a[i]]; int b1 = rev[b[i]]; int tmp = lca(a1, b1); //~ cout << tmp << " " << num[tmp] << endl; ans.push_back(num[tmp]); } return ans; } //~ signed main() { //~ read_array(3, {1, 3, 2, 4, 6, 5, 9}); //~ vector<int> a = {0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 6}; //~ vector<int> b = {0, 1, 4, 6, 1, 2, 6, 2, 3, 3, 5, 5, 6}; //~ read_array(3, {40, 20, 30, 10}); //~ read_array(3, {40, 20, 30, 10}); //~ vector<int> a = {0, 0, 0, 0, 1, 1, 1, 2, 2, 3}; //~ vector<int> b = {0, 1, 2, 3, 1, 2, 3, 2, 3, 3}; //~ solve_queries(3, 4, str, a, b); //~ }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...