답안 #698457

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

using i64 = long long;

constexpr int B = 1000;

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 1580 ms 55956 KB Output is correct
2 Correct 1301 ms 55956 KB Output is correct
3 Correct 1496 ms 53604 KB Output is correct
4 Correct 1207 ms 53028 KB Output is correct
5 Correct 1280 ms 55600 KB Output is correct
6 Correct 1212 ms 53172 KB Output is correct
7 Correct 1274 ms 55796 KB Output is correct
8 Correct 1233 ms 53500 KB Output is correct
9 Correct 1217 ms 53032 KB Output is correct
10 Correct 1241 ms 54028 KB Output is correct
11 Correct 1243 ms 53844 KB Output is correct
12 Correct 1196 ms 52988 KB Output is correct
13 Correct 1231 ms 54180 KB Output is correct
14 Correct 1271 ms 54820 KB Output is correct
15 Correct 1266 ms 55392 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 1211 ms 53812 KB Output is correct
18 Correct 1213 ms 53648 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3083 ms 56244 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3084 ms 8020 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1580 ms 55956 KB Output is correct
2 Correct 1301 ms 55956 KB Output is correct
3 Correct 1496 ms 53604 KB Output is correct
4 Correct 1207 ms 53028 KB Output is correct
5 Correct 1280 ms 55600 KB Output is correct
6 Correct 1212 ms 53172 KB Output is correct
7 Correct 1274 ms 55796 KB Output is correct
8 Correct 1233 ms 53500 KB Output is correct
9 Correct 1217 ms 53032 KB Output is correct
10 Correct 1241 ms 54028 KB Output is correct
11 Correct 1243 ms 53844 KB Output is correct
12 Correct 1196 ms 52988 KB Output is correct
13 Correct 1231 ms 54180 KB Output is correct
14 Correct 1271 ms 54820 KB Output is correct
15 Correct 1266 ms 55392 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 1211 ms 53812 KB Output is correct
18 Correct 1213 ms 53648 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 0 ms 212 KB Output is correct
21 Execution timed out 3083 ms 56244 KB Time limit exceeded
22 Halted 0 ms 0 KB -