답안 #285904

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
285904 2020-08-29T18:05:03 Z caoash 케이크 (CEOI14_cake) C++14
35 / 100
2000 ms 25464 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 + 1, 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 - 1) > best) {
                        ans = mid;
                        lo = mid + 1;
                    }
                    else {
                        hi = mid - 1;
                    }
                }
                cout << (x - ans - 1) << '\n';
            }
        }
    }
}

# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 21 ms 640 KB Output is correct
5 Correct 108 ms 1400 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2060 ms 4064 KB Time limit exceeded
2 Execution timed out 2048 ms 8824 KB Time limit exceeded
3 Execution timed out 2016 ms 4684 KB Time limit exceeded
4 Correct 400 ms 24568 KB Output is correct
5 Execution timed out 2041 ms 4624 KB Time limit exceeded
6 Execution timed out 2033 ms 5296 KB Time limit exceeded
7 Execution timed out 2056 ms 5172 KB Time limit exceeded
8 Correct 406 ms 25464 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 412 ms 7032 KB Output is correct
2 Correct 276 ms 7032 KB Output is correct
3 Correct 282 ms 6904 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 507 ms 15940 KB Output is correct
6 Correct 589 ms 15992 KB Output is correct
7 Correct 425 ms 15608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 628 ms 1896 KB Output is correct
2 Correct 829 ms 2040 KB Output is correct
3 Execution timed out 2072 ms 5108 KB Time limit exceeded
4 Execution timed out 2040 ms 5196 KB Time limit exceeded
5 Correct 1469 ms 4344 KB Output is correct
6 Execution timed out 2081 ms 5988 KB Time limit exceeded
7 Execution timed out 2045 ms 3212 KB Time limit exceeded
8 Execution timed out 2029 ms 9148 KB Time limit exceeded
9 Execution timed out 2037 ms 16928 KB Time limit exceeded
10 Execution timed out 2086 ms 6180 KB Time limit exceeded
11 Execution timed out 2082 ms 3572 KB Time limit exceeded
12 Execution timed out 2068 ms 14500 KB Time limit exceeded
13 Execution timed out 2087 ms 17960 KB Time limit exceeded