답안 #546399

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
546399 2022-04-07T12:50:42 Z Soul234 Growing Trees (BOI11_grow) C++14
100 / 100
201 ms 4612 KB
#include<bits/stdc++.h>
using namespace std;

void DBG() { cerr << "]\n"; }
template<class H, class... T> void DBG(H h, T... t) {
    cerr << h; if(sizeof...(t)) cerr << ", ";
    DBG(t...);
}
#ifdef LOCAL
#define dbg(...) cerr << "[" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__)
#else
#define dbg(...) 0
#endif // LOCAL

#define FOR(i,a,b) for(int i = (a) ; i<(b) ; i++)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for(int i = (b)-1 ; i>=(a) ; i--)
#define R0F(i,a) ROF(i,0,a)
#define each(e,a) for(auto &e : (a))
#define sz(v) (int)(v).size()
#define all(v) (v).begin(),(v).end()
#define rall(v) (v).rbegin(),(v).rend()
#define pb push_back
#define tcT template<class T
#define nl "\n"

using ll = long long;
using vi = vector<int>;
using pi = pair<int,int>;
using str = string;
tcT> using V = vector<T>;
tcT> using pqg = priority_queue<T,vector<T>,greater<T>>;

void setIO(string NAME = "") {
    cin.tie(0)->sync_with_stdio(0);
    if(sz(NAME)) {
        freopen((NAME + ".inp").c_str(),"r",stdin);
        freopen((NAME + ".out").c_str(),"w",stdout);
    }
}

const int SZ = 1<<17;
int st[SZ<<1], lzy[SZ<<1], H[SZ];
int N, M;

void build(int ind = 1, int L = 0, int R = N) {
    if(L+1 == R) st[ind] = H[L];
    else {
        int mid = (L + R) >> 1;
        build(ind<<1, L, mid);
        build(ind<<1|1, mid, R);
        st[ind] = max(st[ind<<1], st[ind<<1|1]);
    }
}

void addTo(int ind, int val) {
    st[ind] += val;
    lzy[ind] += val;
}

void push(int ind) {
    addTo(ind<<1, lzy[ind]);
    addTo(ind<<1|1, lzy[ind]);
    lzy[ind] = 0;
}

void upd(int l, int r, int ind = 1, int L = 0, int R = N) {
    if(L >= r || R <= l) return;
    if(l <= L && R <= r) return addTo(ind, 1);
    push(ind);
    int mid = (L + R) >> 1;
    upd(l, r, ind<<1, L, mid);
    upd(l, r, ind<<1|1, mid, R);
    st[ind] = max(st[ind<<1], st[ind<<1|1]);
}

int getVal(int id, int ind = 1, int L = 0, int R = N) {
    if(L+1 == R) return st[ind];
    else {
        push(ind);
        int mid = (L + R) >> 1;
        if(id>=mid) return getVal(id, ind<<1|1, mid, R);
        else return getVal(id, ind<<1, L, mid);
    }
}

int query(int val, int ind = 1, int L = 0, int R = N) {
    if(L+1 == R) {
        if(st[ind] > val) return L;
        else return R;
    }
    push(ind);
    int mid = (L + R) >> 1;
    if(st[ind<<1] > val) return query(val, ind<<1, L, mid);
    else return query(val, ind<<1|1, mid, R);
}

void solve() {
    cin>>N>>M;
    F0R(i,N) cin>>H[i];
    sort(H, H+N);
    build();
    F0R(_,M) {
        char t;
        cin>>t;
        if(t == 'F') {
            int amt, mnH;
            cin>>amt>>mnH;
            int lo = query(mnH-1);
            if(lo == N) continue;
            int hi = min(N-1, lo + amt -1);
            int val = getVal(hi);
            int hi_ = query(val-1);
            if(lo<hi_) upd(lo,hi_);
            amt = hi - hi_ + 1;
            hi_ = query(val);
            upd(hi_- amt, hi_);
        }
        else {
            int lo, hi; cin>>lo>>hi;
            cout << query(hi) - query(lo-1) << nl;
        }
    }
}

int main() {
    setIO();

    int t=1;
    //cin>>t;
    while(t-->0) {
        solve();
    }

    return 0;
}

Compilation message

grow.cpp: In function 'void setIO(std::string)':
grow.cpp:37:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   37 |         freopen((NAME + ".inp").c_str(),"r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
grow.cpp:38:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   38 |         freopen((NAME + ".out").c_str(),"w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 97 ms 2988 KB Output is correct
2 Correct 116 ms 4384 KB Output is correct
3 Correct 201 ms 4340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 2 ms 340 KB Output is correct
3 Correct 2 ms 340 KB Output is correct
4 Correct 2 ms 340 KB Output is correct
5 Correct 39 ms 1528 KB Output is correct
6 Correct 52 ms 1716 KB Output is correct
7 Correct 5 ms 468 KB Output is correct
8 Correct 33 ms 1260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 44 ms 924 KB Output is correct
2 Correct 54 ms 1860 KB Output is correct
3 Correct 2 ms 468 KB Output is correct
4 Correct 38 ms 1396 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 49 ms 972 KB Output is correct
2 Correct 53 ms 1716 KB Output is correct
3 Correct 9 ms 596 KB Output is correct
4 Correct 49 ms 1864 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 68 ms 1876 KB Output is correct
2 Correct 99 ms 4036 KB Output is correct
3 Correct 13 ms 1236 KB Output is correct
4 Correct 149 ms 4028 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 99 ms 2908 KB Output is correct
2 Correct 101 ms 4052 KB Output is correct
3 Correct 179 ms 4156 KB Output is correct
4 Correct 13 ms 1256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 94 ms 3036 KB Output is correct
2 Correct 86 ms 4004 KB Output is correct
3 Correct 182 ms 4324 KB Output is correct
4 Correct 17 ms 1236 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 119 ms 3096 KB Output is correct
2 Correct 97 ms 4116 KB Output is correct
3 Correct 29 ms 3476 KB Output is correct
4 Correct 105 ms 3996 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 3032 KB Output is correct
2 Correct 104 ms 4380 KB Output is correct
3 Correct 150 ms 4612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 72 ms 3292 KB Output is correct