답안 #1010853

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1010853 2024-06-29T12:41:21 Z vjudge1 Queue (CEOI06_queue) C++17
96 / 100
1000 ms 18772 KB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define FF first
#define SS second
#define all(a) a.begin(), a.end()
#define mod (ll)(1000000007)

const int inf = 1e9;
int main() {
    ios_base::sync_with_stdio(0);cin.tie(0);

    int n;
    cin >> n;
    map<int, int> Nxt, Prv;
    set<array<int, 2>> st;
    st.insert({0, inf + 1});

    while (n--) {
        int a, b;
        cin >> a >> b;

        auto ind = st.upper_bound({a, 2 * inf});
        ind--;
        auto cur = *ind;
        if (a >= cur[0] && a <= cur[1]) {
            st.erase(ind);
            if (a - 1 >= cur[0]) {
                st.insert({cur[0], a - 1});
            }
            if (a + 1 <= cur[1]) {
                st.insert({a + 1, cur[1]});
            }
        }

        swap(a, b);
        ind = st.upper_bound({a, 2 * inf});
        ind--;
        cur = *ind;
        if (a >= cur[0] && a <= cur[1]) {
            st.erase(ind);
            if (a - 1 >= cur[0]) {
                st.insert({cur[0], a - 1});
            }
            if (a + 1 <= cur[1]) {
                st.insert({a + 1, cur[1]});
            }
        }
        swap(a, b);

        if (!Prv[a]) {
            Prv[a] = a - 1;
            Nxt[a - 1] = a;
        }
        if (!Prv[b]) {
            Prv[b] = b - 1;
            Nxt[b - 1] = b;
        }
        if (!Nxt[a]) {
            Nxt[a] = a + 1;
            Prv[a + 1] = a;
        }
        if (!Nxt[b]) {
            Nxt[b] = b + 1;
            Prv[b + 1] = b;
        }
        Nxt[Prv[a]] = Nxt[a], Prv[Nxt[a]] = Prv[a];
        Nxt[Prv[b]] = a, Prv[a] = Prv[b];
        Nxt[a] = b, Prv[b] = a;
    }
    vector<int> Pos, Val;
    int q;
    cin >> q;
    vector<array<int, 2>> Q(q);
    for (int i = 0; i < q; i++) {
        char kind;
        int cur;
        cin >> kind >> cur;
        if (kind == 'P') {
            Q[i][0] = 0;
            Val.push_back(cur);
        }
        else {
            Q[i][0] = 1;
            Pos.push_back(cur);
        }
        Q[i][1] = cur;
    }

    int pos = 0, val = 0;
    sort(all(Pos));
    sort(all(Val));

    if (!Nxt[0]) {
        Nxt[0] = 1;
    }
    if (!Nxt[inf]) {
        Nxt[inf] = inf + 1;
    }

    vector<array<int, 2>> Ans;
    map<int, int> Ansv, Ansp;
    int cur_val = 0, cur_ind = 0, done = 0;
    while (done < q) {
        if (Nxt.count(cur_val)) {
            int lv = cur_val, rv = cur_val;
            int lp = cur_ind, rp = cur_ind;
            int idx = lower_bound(all(Val), lv) - Val.begin();
            while (idx < Val.size() && Val[idx] <= rv) {
                Ansp[Val[idx]] = cur_ind;
                idx++;
                done++;
            }
            idx = lower_bound(all(Pos), lp) - Pos.begin();
            while (idx < Pos.size() && Pos[idx] <= rp) {
                Ansv[Pos[idx]] = cur_val;
                idx++;
                done++;
            }
            cur_val = Nxt[cur_val];
            cur_ind++;
            continue;
        }
        auto ind = st.upper_bound({cur_val,  2 * inf});
        ind--;
        auto cur = *ind;
        int lv = cur_val, rv = cur[1] - 1;
        int lp = cur_ind, rp = cur_ind + cur[1] - cur_val - 1;
        int idx = lower_bound(all(Val), lv) - Val.begin();
        while (idx < Val.size() && Val[idx] <= rv) {
            Ansp[Val[idx]] = cur_ind + Val[idx] - lv;
            idx++;
            done++;
        }
        idx = lower_bound(all(Pos), lp) - Pos.begin();
        while (idx < Pos.size() && Pos[idx] <= rp) {
            Ansv[Pos[idx]] = cur_val + Pos[idx] - lp;
            idx++;
            done++;
        }
        cur_ind += cur[1] - cur_val;
        cur_val = cur[1];
    }

    for (int i = 0; i < q; i++) {
        if (!Q[i][0]) {
            cout << Ansp[Q[i][1]] << endl;
        }
        else {
            cout << Ansv[Q[i][1]] << endl;
        }
    }

}

Compilation message

queue.cpp: In function 'int main()':
queue.cpp:110:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  110 |             while (idx < Val.size() && Val[idx] <= rv) {
      |                    ~~~~^~~~~~~~~~~~
queue.cpp:116:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |             while (idx < Pos.size() && Pos[idx] <= rp) {
      |                    ~~~~^~~~~~~~~~~~
queue.cpp:131:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  131 |         while (idx < Val.size() && Val[idx] <= rv) {
      |                ~~~~^~~~~~~~~~~~
queue.cpp:137:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  137 |         while (idx < Pos.size() && Pos[idx] <= rp) {
      |                ~~~~^~~~~~~~~~~~
queue.cpp:91:9: warning: unused variable 'pos' [-Wunused-variable]
   91 |     int pos = 0, val = 0;
      |         ^~~
queue.cpp:91:18: warning: unused variable 'val' [-Wunused-variable]
   91 |     int pos = 0, val = 0;
      |                  ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 4 ms 600 KB Output is correct
5 Correct 28 ms 4132 KB Output is correct
6 Correct 41 ms 5080 KB Output is correct
7 Correct 55 ms 5720 KB Output is correct
8 Correct 62 ms 7644 KB Output is correct
9 Correct 75 ms 7760 KB Output is correct
10 Correct 81 ms 8040 KB Output is correct
11 Correct 180 ms 10512 KB Output is correct
12 Correct 176 ms 8072 KB Output is correct
13 Correct 204 ms 11056 KB Output is correct
14 Correct 206 ms 11112 KB Output is correct
15 Correct 210 ms 11136 KB Output is correct
16 Correct 228 ms 11344 KB Output is correct
17 Correct 24 ms 1840 KB Output is correct
18 Correct 45 ms 2900 KB Output is correct
19 Correct 67 ms 2640 KB Output is correct
20 Correct 132 ms 4872 KB Output is correct
21 Execution timed out 1046 ms 12368 KB Time limit exceeded
22 Correct 239 ms 15160 KB Output is correct
23 Correct 275 ms 18740 KB Output is correct
24 Correct 280 ms 18772 KB Output is correct
25 Correct 225 ms 13260 KB Output is correct