Submission #1218446

#TimeUsernameProblemLanguageResultExecution timeMemory
1218446damamilaFloppy (RMI20_floppy)C++20
18.45 / 100
27 ms3196 KiB
#include <bits/stdc++.h> using namespace std; //~ #define int long long string str; int zp; vector<pair<int, int>> segtree; void save_to_floppy(const string &bits); //~ void save_to_floppy(const string &bits) { //~ return; //~ } void read_array(int subtask_id, const vector<int> &v) { vector<pair<int, int>> srt; int n = v.size(); for (int i = 0; i < n; i++) { srt.push_back({v[i], i}); } sort(srt.begin(), srt.end()); vector<int> num(n); for (int i = 0; i < n; i++) num[srt[i].second] = i; string res; for (int i = 0; i < n; i++) { for (int j = 0; j < 16; j++) { if ((1<<j)&num[i]) res.push_back('1'); else res.push_back('0'); } } //~ cout << res << endl; str = res; save_to_floppy(res); } vector<int> number() { //turns bits into vector<int> res; for (int i = 0; i < (int)str.size(); i += 16) { int curr = 0; for (int j = 0; j < 16; j++) { if (str[i+j] == '1') curr += (1<<j); } res.push_back(curr); } return res; } pair<int, int> query(int l, int r, int lb = 0, int rb = zp-1, int idx = 1) { if (l <= lb && r >= rb) return segtree[idx]; if (l > rb || r < lb) return {-1, -1}; int m = (lb+rb)/2; pair<int, int> left = query(l, r, lb, m, idx*2); pair<int, int> right = query(l, r, m+1, rb, idx*2+1); if (left.first > right.first) return left; else return right; } std::vector<int> solve_queries(int subtask_id, int N, const std::string &bits, const std::vector<int> &a, const std::vector<int> &b) { vector<int> ans; str = bits; vector<int> info = number(); //~ for (int i : info) cout << i << " "; int tmp = log2(2*N-1); zp = 1<<tmp; segtree = vector<pair<int, int>> (2*zp, {0, 0}); //~ cout << "AA" << endl; for (int i = 0; i < N; i++) { segtree[i+zp] = {info[i], i}; } //~ cout << "AA" << endl; for (int i = zp-1; i > 0; i--) { if (segtree[i*2].first > segtree[i*2+1].first) { segtree[i] = segtree[i*2]; } else segtree[i] = segtree[i*2+1]; } //~ cout << "AA" << endl; for (int q = 0; q < (int)a.size(); q++) { ans.push_back(query(a[q], b[q]).second); } //~ for (int i : ans) cout << i << " "; 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}); //~ 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...