Submission #1204739

#TimeUsernameProblemLanguageResultExecution timeMemory
12047391binFloppy (RMI20_floppy)C++20
0 / 100
50 ms4680 KiB
#include<bits/stdc++.h>
#include "floppy.h"

using namespace std;

typedef long long ll;
#define all(v) v.begin(), v.end()

// void save_to_floppy(string bits) {
//     cout << bits << endl;
//     return;
// }

void dfs(int x, vector<int> & L, vector<int>& R, string& bits) {
    if (x == -1) return;
    bits += (L[x] != -1) + '0';
    bits += (R[x] != -1) + '0';
    dfs(L[x], L, R, bits);
    dfs(R[x], L, R, bits);
}

void read_array(int subtask_id, const vector<int> &v) {
    int n = v.size(), x;
    vector<vector<int>> adj(n, vector<int>());
    vector<int> L(n, -1), R(n, -1);
    stack<int> st;

    string bits = "";
    for (int i = 0; i < n; i++) {
        while (st.size() && v[st.top()] < v[i]) {
            int j = st.top(); st.pop();
            if (st.empty() || v[st.top()] > v[i]) L[i] = j;
            else R[j] = i;
        }
        st.emplace(i);
    }
    while (st.size()) {
        x = st.top(); st.pop();
        if (st.size()) R[st.top()] = x;
    }

    dfs(x, L, R, bits);
    save_to_floppy(bits);
}

const int B = 1 << 16;
int t, cur;
pair<int, int> seg[B * 2];
void find(string bits, int v) {
    int tmp = t++;
    if (bits[tmp * 2] == '1') find(bits, v - 1);
    seg[B + cur] = {v, cur};
    cur++;
    if (bits[tmp * 2 + 1] == '1') find(bits, v - 1);
}

int Max(int l, int r) {
    l += B; r += B;
    pair<int, int> ret = {0, 0};
    while (l <= r) {
        if (l & 1) ret = max(ret, seg[l++]);
        if (!(r & 1)) ret = max(ret, seg[r--]);
        l >>= 1;r >>= 1;
    }
    return ret.second;
}

vector<int> solve_queries(int subtask_id, int N,
        const string &bits,
        const vector<int> &a, const std::vector<int> &b) {

    find(bits, N);
    vector<int> ans;
    for (int i = B - 1; i; i--) seg[i] = max(seg[i * 2], seg[i * 2 + 1]);
    for (int i = 0; i < a.size(); i++) {
        int x = a[i], y = b[i];
        ans.emplace_back(Max(x,y));
    }
    return ans;
}
//
// int main(void) {
//     ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//
//     // vector<int> v = {40, 20, 30, 10};
//     // read_array(0, v);
//
//     string bits = "01110000";
//     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(0, 4, bits, a, b);
//
//     for (int& x : solve_queries(0, 4, bits, a, b)) cout << x << ' ';
//     return 0;
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...