답안 #698456

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
698456 2023-02-13T14:05:41 Z Cyanmond Abracadabra (CEOI22_abracadabra) C++17
10 / 100
3000 ms 56196 KB
#include <bits/stdc++.h>

using i64 = long long;

constexpr int B = 200;

struct SuperArray {
    std::vector<std::vector<int>> data;
    std::vector<int> maxVal;
    int blocks, countOp;
    
    SuperArray(std::vector<int> A) {
        data.push_back(A);
        rebuild();        
    }

    void rebuild() {
        std::vector<int> a;
        for (auto &vec : data) {
            std::copy(vec.begin(), vec.end(), std::back_inserter(a));
        }
        data.clear();
        const int n = (int)a.size();
        blocks = (n + B - 1) / B;
        data.resize(blocks);
        maxVal.assign(blocks, -1);
        for (int x = 0; x < blocks; ++x) {
            for (int i = x * B; i < std::min((x + 1) * B, n); ++i) {
                data[x].push_back(a[i]);
                maxVal[x] = std::max(maxVal[x], a[i]);
            }
        }
        countOp = 0;
    }

    void incOp() {
        ++countOp;
        if (countOp >= 3 * B) {
            rebuild();
        }
    }

    int get(int i) {
        int sum = 0;
        int ret = -1;
        for (const auto &vec : data) {
            if (sum + (int)vec.size() <= i) {
                sum += (int)vec.size();
            } else {
                ret = vec[i - sum];
                break;
            }
        }
        return ret;
    }

    void recalc(int x) {
        maxVal[x] = -1;
        for (const auto e : data[x]) {
            maxVal[x] = std::max(maxVal[x], e);
        }
    }

    void erase(int i) {
        incOp();
        int sum = 0;
        for (int x = 0; x < blocks; ++x) {
            auto &vec = data[x];
            if (sum + (int)vec.size() <= i) {
                sum += (int)vec.size();
            } else {
                vec.erase(vec.begin() + (i - sum));
                recalc(x);
                break;
            }
        }
    }

    int find(int l, int v) {
        int sum = 0;
        for (int x = 0; x < blocks; ++x) {
            if (sum + (int)data[x].size() <= l or maxVal[x] < v) {
                sum += (int)data[x].size();
            } else {
                for (int i = std::max(0, l - sum); i < (int)data[x].size(); ++i) {
                    if (data[x][i] >= v) {
                        return sum + i;
                    }
                }
            }
        }
        return sum;
    }

    void insert(int i, int v) {
        incOp();
        int sum = 0;
        for (int x = 0; x < blocks; ++x) {
            auto &vec = data[x];
            if (sum + (int)vec.size() <= i) {
                sum += (int)vec.size();
            } else {
                vec.insert(vec.begin() + (i - sum), v);
                recalc(x);
                break;
            }
        }
    }
};

struct Query {
    i64 t;
    int i;
    int queryId;
};

void solve(int N, int Q, std::vector<int> P, std::vector<std::pair<i64, int>> queries) {
    std::vector<Query> qs(Q);
    for (int i = 0; i < Q; ++i) {
        qs[i] = {queries[i].first, queries[i].second, i};
    }
    std::sort(qs.begin(), qs.end(), [](auto a, auto b) {
        return a.t < b.t;
    });
    SuperArray ar(P);
    std::vector<int> answer(Q);
    auto answerQuery = [&](const int t) {
        static int i = 0;
        if (t == -1) {
            while (i != Q) {
                answer[qs[i].queryId] = ar.get(qs[i].i);
                ++i;
            }
        } else {
            while (i != Q and qs[i].t == t) {
                answer[qs[i].queryId] = ar.get(qs[i].i);
                ++i;
            }
        }
    };
    answerQuery(0);

    int countShuffle = 0, minPos = N;
    for (int v = N; v >= 1; --v) {
        if (minPos == N / 2) {
            break;
        }
        const int pos = ar.find(0, v);
        if (pos >= N / 2) {
            minPos = std::min(minPos, pos);
            continue;
        }
        const int w = minPos - N / 2;
        const int dist = N / 2 - pos;
        const int c = (dist + w - 1) / w;
        for (int gomi = 0; gomi < c; ++gomi) {
            int l = 0;
            for (int i = N / 2; i < minPos; ++i) {
                const int val = ar.get(i);
                int p = ar.find(l, val);
                if (p >= i) {
                    p = i;
                }
                ar.erase(i);
                ar.insert(p, val);
                l = p + 1;
            }
            answerQuery(++countShuffle);
        }
        minPos = std::min(minPos, ar.find(0, v));
    }
    answerQuery(-1);

    for (const auto e : answer) {
        std::cout << e << std::endl;
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    // O(N^2)
    int N, Q;
    std::cin >> N >> Q;
    std::vector<int> P(N);
    for (auto &e : P) {
        std::cin >> e;
    }
    std::vector<std::pair<i64, int>> queries(Q);
    for (auto &[t, i] : queries) {
        std::cin >> t >> i;
        --i;
    }
    solve(N, Q, P, queries);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1402 ms 55564 KB Output is correct
2 Correct 1307 ms 55536 KB Output is correct
3 Correct 1310 ms 53448 KB Output is correct
4 Correct 1248 ms 52856 KB Output is correct
5 Correct 1283 ms 55344 KB Output is correct
6 Correct 1219 ms 53016 KB Output is correct
7 Correct 1297 ms 55476 KB Output is correct
8 Correct 1227 ms 53536 KB Output is correct
9 Correct 1226 ms 52764 KB Output is correct
10 Correct 1273 ms 53876 KB Output is correct
11 Correct 1272 ms 53636 KB Output is correct
12 Correct 1283 ms 52776 KB Output is correct
13 Correct 1265 ms 53864 KB Output is correct
14 Correct 1277 ms 54552 KB Output is correct
15 Correct 1268 ms 55400 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 1229 ms 53728 KB Output is correct
18 Correct 1216 ms 53300 KB Output is correct
19 Correct 1 ms 212 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3070 ms 56196 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3078 ms 8216 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1402 ms 55564 KB Output is correct
2 Correct 1307 ms 55536 KB Output is correct
3 Correct 1310 ms 53448 KB Output is correct
4 Correct 1248 ms 52856 KB Output is correct
5 Correct 1283 ms 55344 KB Output is correct
6 Correct 1219 ms 53016 KB Output is correct
7 Correct 1297 ms 55476 KB Output is correct
8 Correct 1227 ms 53536 KB Output is correct
9 Correct 1226 ms 52764 KB Output is correct
10 Correct 1273 ms 53876 KB Output is correct
11 Correct 1272 ms 53636 KB Output is correct
12 Correct 1283 ms 52776 KB Output is correct
13 Correct 1265 ms 53864 KB Output is correct
14 Correct 1277 ms 54552 KB Output is correct
15 Correct 1268 ms 55400 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 1229 ms 53728 KB Output is correct
18 Correct 1216 ms 53300 KB Output is correct
19 Correct 1 ms 212 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Execution timed out 3070 ms 56196 KB Time limit exceeded
22 Halted 0 ms 0 KB -