답안 #285998

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
285998 2020-08-29T21:38:12 Z caoash 케이크 (CEOI14_cake) C++14
35 / 100
2000 ms 5116 KB
#pragma GCC target ("avx,avx2")
#pragma GCC optimize ("Ofast")

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

    T query(int v, int l, int r, int val, int dir) {
        if (r < l || tree[v] <= val) {
            return -1;
        }
        else if(l == r) {
            // cout << "DONE: " << l << "\n";
            return l;
        }
        else {
            int m = (l + r) / 2;
            // cout << "v, l, r, dir: " << tree[2 * v + 1] << " " << v << " " << l << " " << r << '\n';
            if (dir) {
                if (tree[2 * v + 2] > val) { 
                    return query(2 * v + 2, m + 1, r, val, dir);
                }
                else {
                    return query(2 * v + 1, l, m, val, dir);
                }
            }
            else {
                if (tree[2 * v + 1] > val) {
                    return query(2 * v + 1, l, m, val, dir); 
                }
                else {
                    return query(2 * v + 2, m + 1, r, val, dir);
                }
            }
        }
    }
};

const int MX = 250005;

int pos[MX];

Seg<int, MX> lft, rgt; 

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;
        if(i < a) lft.update(0, 0, n - 1, i, d[i]);
        else if (i > a) rgt.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;
    vector<pi> top;
    for (int i = max(1, n - 9); i <= n; i++) {
        top.pb(mp(i, pos[i]));
    }
    vector<pi> order;
    while(q--) {
        char qt; cin >> qt; 
        if (qt == 'E') {
            int i, e; cin >> i >> e;
            i--;
            for (int j = 0; j < e - 1; j++) {
                if (top.back().s != i) {
                    int v = top.back().f; int p = top.back().s;
                    order.pb(mp(v + 1, p));
                    if(p < a) lft.update(0, 0, n - 1, p, v + 1);
                    else if(p > a) rgt.update(0, 0, n - 1, p, v + 1);
                    d[p] = v + 1;
                }
                else {
                    j--;
                }
                top.pop_back();
            }
            int prev = d[i];
            d[i] = top.back().f + 1;
            if(i < a) lft.update(0, 0, n - 1, i, top.back().f + 1);
            else if(i > a) rgt.update(0, 0, n - 1, i, top.back().f + 1);
            order.pb(mp(top.back().f + 1, i));
            bool found = false;
            while (!top.empty()) {
                if(top.back().f != prev) {
                     order.pb(mp(top.back().f, top.back().s));
                     found = true;
                }
                top.pop_back(); 
            }
            if (!found) order.pop_back();
            reverse(all(order));
            for (pi x : order) {
                top.pb(x);
            }
            order.clear();
        }
        else {
            int x; cin >> x;
            x--;
            if (x == a) { 
                cout << 0 << '\n';
                continue;
            }
            int best = 0;
            if (x < a) best = lft.query2(0, 0, n - 1, x, a - 1);
            else if (x > a) best = rgt.query2(0, 0, n - 1, a + 1, x);
            if (x < a) {
                int ans = rgt.query(0, 0, n - 1, best, 0);
                if (rgt.query2(0, 0, n - 1, a + 1, n - 1) <= best) {
                    ans = n;
                }
                cout << (ans - x - 1) << '\n';
            }
            else if(x > a) {
                int ans = lft.query(0, 0, n - 1, best, 1);
                if (lft.query2(0, 0, n - 1, 0, a - 1) <= best) {
                    ans = -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 23 ms 384 KB Output is correct
5 Correct 145 ms 760 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2099 ms 760 KB Time limit exceeded
2 Execution timed out 2077 ms 788 KB Time limit exceeded
3 Execution timed out 2099 ms 760 KB Time limit exceeded
4 Correct 203 ms 640 KB Output is correct
5 Execution timed out 2096 ms 1072 KB Time limit exceeded
6 Execution timed out 2094 ms 1144 KB Time limit exceeded
7 Execution timed out 2085 ms 1176 KB Time limit exceeded
8 Correct 209 ms 896 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 89 ms 2808 KB Output is correct
2 Correct 74 ms 2680 KB Output is correct
3 Correct 69 ms 2680 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 123 ms 5116 KB Output is correct
6 Correct 135 ms 5112 KB Output is correct
7 Correct 111 ms 4856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 888 ms 632 KB Output is correct
2 Correct 1313 ms 760 KB Output is correct
3 Execution timed out 2098 ms 1784 KB Time limit exceeded
4 Execution timed out 2087 ms 1984 KB Time limit exceeded
5 Correct 1986 ms 1028 KB Output is correct
6 Execution timed out 2088 ms 1960 KB Time limit exceeded
7 Execution timed out 2071 ms 1188 KB Time limit exceeded
8 Execution timed out 2097 ms 2496 KB Time limit exceeded
9 Execution timed out 2089 ms 5032 KB Time limit exceeded
10 Execution timed out 2068 ms 1112 KB Time limit exceeded
11 Execution timed out 2080 ms 1284 KB Time limit exceeded
12 Execution timed out 2089 ms 4788 KB Time limit exceeded
13 Execution timed out 2079 ms 4924 KB Time limit exceeded