답안 #1010852

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1010852 2024-06-29T12:40:32 Z vjudge1 Queue (CEOI06_queue) C++17
96 / 100
1000 ms 20216 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 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 2 ms 344 KB Output is correct
4 Correct 4 ms 604 KB Output is correct
5 Correct 37 ms 4788 KB Output is correct
6 Correct 50 ms 5844 KB Output is correct
7 Correct 65 ms 6484 KB Output is correct
8 Correct 81 ms 8396 KB Output is correct
9 Correct 96 ms 8528 KB Output is correct
10 Correct 116 ms 8928 KB Output is correct
11 Correct 204 ms 11380 KB Output is correct
12 Correct 179 ms 8536 KB Output is correct
13 Correct 212 ms 11860 KB Output is correct
14 Correct 219 ms 12092 KB Output is correct
15 Correct 242 ms 12368 KB Output is correct
16 Correct 205 ms 12372 KB Output is correct
17 Correct 31 ms 2284 KB Output is correct
18 Correct 71 ms 3668 KB Output is correct
19 Correct 109 ms 3664 KB Output is correct
20 Correct 152 ms 6352 KB Output is correct
21 Execution timed out 1080 ms 13396 KB Time limit exceeded
22 Correct 257 ms 16416 KB Output is correct
23 Correct 297 ms 20052 KB Output is correct
24 Correct 298 ms 20216 KB Output is correct
25 Correct 255 ms 14864 KB Output is correct