답안 #531359

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
531359 2022-02-28T14:03:34 Z OttoTheDino Growing Trees (BOI11_grow) C++17
0 / 100
1000 ms 2200 KB
#include <bits/stdc++.h>
using namespace std;

#define rep(i,s,e)                  for (int i = s; i <= e; ++i)
#define rrep(i,s,e)                 for (int i = s; i >= e; --i)
#define pb                          push_back
#define pf                          push_front
#define fi                          first
#define se                          second
#define all(a)                      a.begin(), a.end()
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<int> vi;
typedef vector<double> vd;
typedef vector<string> vs;
typedef vector<ll> vll;
 
const int mx = 1e5;
int seg[4*mx+1] = {}, n;

void upd (int x, int l, int r, int bl, int br, int id) {
    if (l==bl && r==br) {
        seg[id] += x;
        return;
    }
    int mid = (bl+br)/2;
    if (r<=mid) upd (x, l, r, bl, mid, 2*id);
    else if (l>mid) upd (x, l, r, mid+1, br, 2*id+1);
    else {
        upd (x, l, mid, bl, mid, 2*id);
        upd (x, mid+1, r, mid+1, br, 2*id+1);
    }
}

int qry (int x, int bl, int br, int id, int res) {
    res += seg[id];
    if (bl==br) return res;
    int mid = (bl+br)/2;
    if (x<=mid) return qry (x, bl, mid, 2*id, res);
    return qry (x, mid+1, br, 2*id+1, res);
}

int get_min (int x) {
    int lo = 1, hi = n+1;
    while (lo<hi) {
        int mid = (lo+hi)/2;
        if (qry(mid,1,mx,1,0)>=x) hi = mid;
        else lo = mid+1;
    }
    return lo;
}

int get_max(int x) {
    int lo = 1, hi = n;
    while (lo<hi) {
        int mid = (lo+hi+1)/2;
        if (qry(mid,1,mx,1,0)>x) hi = mid-1;
        else lo = mid;
    }
    return lo;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int m; cin >> n >> m;
    int a[n+1];
    rep (i,1,n) cin>>a[i];
    sort(a+1,a+n+1);
    rep (i,1,n) upd (a[i], i, i, 1, mx, 1);

    rep (i,1,m) {
        char tp; cin>>tp;
        if (tp=='F') {
            int c, h; cin >> c >> h;
            int j = get_min(h);
            if (j+c-1>=n) upd (1, j, n, 1, mx, 1);

            int h2 = qry (j+c-1, 1, mx, 1, 0);
            int mi = get_min(h2);
            int ma = get_max(h2);

            int cnt = h2-mi+1;
            if (j<mi) upd (1, j, mi-1, 1, mx, 1);
            upd (1, ma-cnt+1, ma, 1, mx, 1);
        }

        else {
            int mini, maxi; cin >> mini >> maxi;
            cout << get_max(maxi) - get_min(mini) + 1 << "\n";
        }
    }


    return 0;
}

# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1039 ms 1780 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1058 ms 332 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1052 ms 452 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1065 ms 456 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1062 ms 1504 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1074 ms 1612 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1067 ms 1480 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1046 ms 1988 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1061 ms 1780 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1002 ms 2200 KB Time limit exceeded
2 Halted 0 ms 0 KB -