제출 #1263553

#제출 시각아이디문제언어결과실행 시간메모리
1263553altern23Floppy (RMI20_floppy)C++20
28 / 100
24 ms2912 KiB
#include "floppy.h"
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define sec second

void read_array(int subtask_id, const std::vector<int> &v) {
    vector<pair<int, int>> isi;

    int N = v.size();
    for(int i = 0; i < N; i++){
        isi.push_back({v[i], i});
    }
    sort(isi.begin(), isi.end());
    
    int cur = 0;
    for(auto &[val, idx] : isi){
        val = ++cur;
    }

    int LOG = 0;
    cur = 1;
    while(cur <= N){
        cur *= 2, LOG++;
    }

    sort(isi.begin(), isi.end(), [&](pair<int, int> a, pair<int, int> b){
        return a.sec < b.sec;
    });

    string bits = "";
    for(auto &[val, idx] : isi){
        for(int j = 0; j < LOG; j++){
            bits.push_back(((val >> j) & 1) + '0');
        }
    }

    save_to_floppy(bits);
}

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

    int Q = a.size();
    vector<int> arr;
    
    int LOG = 0, cur = 1;
    while(cur <= N){
        cur *= 2, LOG++;
    }

    for(int i = 0; i < N; i++){
        int val = 0;
        for(int j = i * LOG; j < i * LOG + LOG; j++){
            val += (1LL << (j - i * LOG)) * (bits[j] == '1');
        }
        arr.push_back(val);
    }

    vector<int> lg(N + 5);
    for(int i = 2; i <= N; i++) lg[i] = lg[i / 2] + 1;

    vector<vector<pair<int, int>>> sp(N, vector<pair<int, int>>(LOG));
    for(int log = 0; log < LOG; log++){
        for(int i = 0; i < N; i++){
            if(log == 0) sp[i][log] = {arr[i], i};
            else{
                if(i + (1LL << (log - 1)) < N) sp[i][log] = max(sp[i][log - 1], sp[i + (1LL << (log - 1))][log - 1]);
            }
        }
    }

    auto query = [&](int l, int r){
        return max(sp[l][lg[r - l + 1]], sp[r - (1LL << lg[r - l + 1]) + 1][lg[r - l + 1]]).sec;
    };

    for(int i = 0; i < Q; i++){
        answers.push_back(query(a[i], b[i]));
    }
    
    return answers;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...