답안 #285901

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
285901 2020-08-29T17:55:56 Z caoash 케이크 (CEOI14_cake) C++14
0 / 100
2000 ms 25272 KB
#include <bits/stdc++.h> 
using namespace std;

using ll = long long;

using vi = vector<int>;
#define pb push_back
#define rsz resize
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()

using pi = pair<int,int>;
#define f first
#define s second
#define mp make_pair

template<class T, int SZ> struct Seg{
    T tree[4*SZ];
    T merge(T a, T b){
        return max(a, b);
    }
    
    void update(int v, int l, int r, int i, T x) {
        if (i > r || i < l) {
            return;
        } else if (l == r) {
            tree[v] = x;
        } else {
            int m = (l + r) / 2;
            update(2 * v + 1, l, m, i, x);
            update(2 * v + 2, m + 1, r, i, x);
            tree[v] = merge(tree[2 * v + 1], tree[2 * v + 2]);
        }
    }

    T query(int v, int l, int r, int ql, int qr) {
        if (l > qr || r < ql) {
            return 0;
        } else if (l >= ql && r <= qr) {
            return tree[v];
        } else {
            int m = (l + r) / 2;
            T a = query(2 * v + 1, l, m, ql, qr);
            T b = query(2 * v + 2, m + 1, r, ql, qr);
            return merge(a,b);
        }
    }
};

const int MX = 200005;

map<int, int> pos;

Seg<int, MX> vals; 

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, a; cin >> n >> a;
    a--;
    vi d(n);
    for (int i = 0; i < n; i++) {
        cin >> d[i]; 
        pos[d[i]] = i;
        vals.update(0, 0, n - 1, i, d[i]);
    }
    /*
    cout << "vals: " << '\n';
    for (int i = 0; i < n; i++) {
        cout << vals.query(0, 0, n - 1, i, i) << " ";
    }
    cout << '\n';
    */ 
    int q; cin >> q;
    vi top;
    for (int i = max(1, n - 9); i <= n; i++) {
        top.pb(i);
    }
    while(q--) {
        char qt; cin >> qt; 
        if (qt == 'E') {
            int i, e; cin >> i >> e;
            i--;
            vi order;
            /* 
            cout << "TOP: " << '\n';
            for (int x : top) {
                cout << x << " ";
            }
            cout << '\n';
            */
            for (int j = 0; j < e - 1; j++) {
                if (pos[top.back()] != i) {
                    order.pb(top.back() + 1);
                    vals.update(0, 0, n - 1, pos[top.back()], top.back() + 1);
                    d[pos[top.back()]] = top.back() + 1;
                    pos[top.back() + 1] = pos[top.back()];
                }
                else {
                    j--;
                }
                top.pop_back();
            }
            int prev = d[i];
            // cout << "prev: " << prev << endl;
            d[i] = top.back() + 1;
            vals.update(0, 0, n - 1, i, top.back() + 1);
            order.pb(top.back() + 1);
            pos[top.back() + 1] = i;
            while (!top.empty()) {
                if(top.back() != prev) order.pb(top.back());
                top.pop_back(); 
            }
            reverse(all(order));
            for (int x : order) {
                top.pb(x);
            }
            /* 
            cout << "vals: " << '\n';
            for (int j = 0; j < n; j++) {
                cout << d[j] << " ";
            }
            cout << '\n';
            */ 
        }
        else {
            int x; cin >> x;
            x--;
            if (x == a) { 
                cout << 0 << '\n';
                continue;
            }
            int best = 0;
            if (x < a) best = vals.query(0, 0, n - 1, x, a - 1);
            else if (x > a) best = vals.query(0, 0, n - 1, a + 1, x);
            if (x < a) {
                int lo = a + 1; int hi = n - 1;
                int ans = n;
                while (lo <= hi) {
                    int mid = (lo + hi) / 2;
                    if (vals.query(0, 0, n - 1, a, mid) > best) {
                        ans = mid;
                        hi = mid - 1;
                    }
                    else {
                        lo = mid + 1;
                    }
                }
                cout << (ans - x - 1) << '\n';
            }
            else {
                int lo = 0; int hi = a - 1;
                int ans = -1;
                while (lo <= hi) {
                    int mid = (lo + hi) / 2;
                    if (vals.query(0, 0, n - 1, mid, a) > best) {
                        ans = mid;
                        lo = mid + 1;
                    }
                    else {
                        hi = mid - 1;
                    }
                }
                cout << (x - ans - 1) << '\n';
            }
        }
    }
}

# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2029 ms 3864 KB Time limit exceeded
2 Execution timed out 2039 ms 8824 KB Time limit exceeded
3 Execution timed out 2085 ms 4636 KB Time limit exceeded
4 Correct 440 ms 24696 KB Output is correct
5 Execution timed out 2045 ms 4732 KB Time limit exceeded
6 Execution timed out 2091 ms 5368 KB Time limit exceeded
7 Execution timed out 2091 ms 5268 KB Time limit exceeded
8 Correct 412 ms 25272 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 420 ms 7032 KB Output is correct
2 Incorrect 274 ms 6928 KB Output isn't correct
3 Incorrect 256 ms 6652 KB Output isn't correct
4 Incorrect 0 ms 384 KB Output isn't correct
5 Correct 516 ms 15736 KB Output is correct
6 Incorrect 627 ms 15864 KB Output isn't correct
7 Incorrect 425 ms 15484 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 623 ms 1816 KB Output isn't correct
2 Incorrect 836 ms 2124 KB Output isn't correct
3 Execution timed out 2033 ms 5272 KB Time limit exceeded
4 Execution timed out 2085 ms 5172 KB Time limit exceeded
5 Incorrect 1441 ms 4472 KB Output isn't correct
6 Execution timed out 2089 ms 5876 KB Time limit exceeded
7 Execution timed out 2051 ms 3240 KB Time limit exceeded
8 Execution timed out 2071 ms 8924 KB Time limit exceeded
9 Execution timed out 2083 ms 16856 KB Time limit exceeded
10 Execution timed out 2089 ms 5940 KB Time limit exceeded
11 Execution timed out 2091 ms 3540 KB Time limit exceeded
12 Execution timed out 2090 ms 14180 KB Time limit exceeded
13 Execution timed out 2088 ms 17792 KB Time limit exceeded