답안 #285988

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
285988 2020-08-29T21:12:47 Z caoash 케이크 (CEOI14_cake) C++14
35 / 100
2000 ms 8164 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 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]));
    }
    while(q--) {
        char qt; cin >> qt; 
        if (qt == 'E') {
            int i, e; cin >> i >> e;
            i--;
            vector<pi> order;
            /* 
            cout << "TOP: " << '\n';
            for (int x : top) {
                cout << x << " ";
            }
            cout << '\n';
            */
            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];
            // cout << "prev: " << prev << endl;
            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));
            while (!top.empty()) {
                if(top.back().f != prev) order.pb(mp(top.back().f, top.back().s));
                top.pop_back(); 
            }
            reverse(all(order));
            for (pi x : order) {
                top.pb(x);
            }
        }
        else {
            // cout << "vals: " << '\n';
            /*
            for (int j = 0; j < n; j++) {
                if (j < a) {
                    cout << lft.query2(0, 0, n - 1, j, j) << " ";
                }
                else if (j == a) {
                    cout << -1 << " ";
                }
                else {
                    cout << rgt.query2(0, 0, n - 1, j, j) << " ";
                }
            }
            */
            // cout << '\n';
            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);
            // cout << "x, a, best: " << x << " " << a << " " << best << '\n';
            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: " << 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 << "ans: " << ans << '\n';
                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 2 ms 384 KB Output is correct
4 Correct 31 ms 504 KB Output is correct
5 Correct 190 ms 768 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2077 ms 1416 KB Time limit exceeded
2 Execution timed out 2078 ms 1940 KB Time limit exceeded
3 Execution timed out 2075 ms 1528 KB Time limit exceeded
4 Correct 311 ms 3064 KB Output is correct
5 Execution timed out 2079 ms 1792 KB Time limit exceeded
6 Execution timed out 2055 ms 1912 KB Time limit exceeded
7 Execution timed out 2087 ms 1728 KB Time limit exceeded
8 Correct 418 ms 3320 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 87 ms 4208 KB Output is correct
2 Correct 74 ms 4088 KB Output is correct
3 Correct 67 ms 4088 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 127 ms 7420 KB Output is correct
6 Correct 127 ms 7416 KB Output is correct
7 Correct 117 ms 7288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1140 ms 1380 KB Output is correct
2 Correct 1710 ms 1436 KB Output is correct
3 Execution timed out 2085 ms 2960 KB Time limit exceeded
4 Execution timed out 2088 ms 2772 KB Time limit exceeded
5 Execution timed out 2093 ms 2044 KB Time limit exceeded
6 Execution timed out 2085 ms 3088 KB Time limit exceeded
7 Execution timed out 2094 ms 1620 KB Time limit exceeded
8 Execution timed out 2092 ms 3704 KB Time limit exceeded
9 Execution timed out 2094 ms 8164 KB Time limit exceeded
10 Execution timed out 2088 ms 1936 KB Time limit exceeded
11 Execution timed out 2093 ms 2072 KB Time limit exceeded
12 Execution timed out 2087 ms 6652 KB Time limit exceeded
13 Execution timed out 2025 ms 7324 KB Time limit exceeded