답안 #1092876

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1092876 2024-09-25T09:33:53 Z daviedu 벽 (IOI14_wall) C++17
100 / 100
599 ms 75688 KB
#include <bits/stdc++.h>
using namespace std;

#define fastio ios_base::sync_with_stdio(0); cin.tie(0)
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define sz(a) (int) (a).size()
#define ll long long
#define ld long double
#define pb push_back

struct P{
    ll x, y;
};

void dbg_out() { cerr << endl; }
template <typename H, typename... T>
void dbg_out(H h, T... t) { cerr << ' ' << h; dbg_out(t...); }
#define dbg(...) { cerr << #__VA_ARGS__ << ':'; dbg_out(__VA_ARGS__); }

#define bound array<int, 2>

const bound neutral = {0, INT_MAX};
const bound no_lazy = {-1, -1};
const int MI = 0, MA = INT_MAX;

class Segtree{
public:
    int n;
    vector<int> t, hi, lo; // lazy is not a bound, but an operation with 2 parameters
    Segtree(int size){
        n = 1;
        while (n < size) n <<= 1;
        t.resize(2*n);
        hi.resize(2*n, MA);
        lo.resize(2*n, MI);
    }
    void apply(int i){
        t[i] = max(t[i], lo[i]);
        t[i] = min(t[i], hi[i]);
        hi[i] = MA;
        lo[i] = MI;
    }

    void comb(int down, int i){
        if (hi[down] <= lo[i]) lo[down] = hi[down] = lo[i];
        if (lo[down] >= hi[i]) lo[down] = hi[down] = hi[i];
        else{
            lo[down] = max(lo[down], lo[i]);
            hi[down] = min(hi[down], hi[i]);
        }
    }

    void prop(int i){
        if (lo[i] == MI && hi[i] == MA) return;
        if (i >= n) apply(i);
        else{
            comb(2*i, i);
            comb(2*i+1, i);
            hi[i] = MA;
            lo[i] = MI;
        }
    }
    void update(int l, int r, int i, int a, int b, int v, int op){
        prop(i);
        if (b < l || r < a) return;
        if (a <= l && r <= b){
            if (op == 1) lo[i] = v;
            else hi[i] = v;
            prop(i);
            return;
        }
        int m = (l+r)/2;
        update(l, m, 2*i, a, b, v, op);
        update(m+1, r, 2*i+1, a, b, v, op);
    }
    void update(int l, int r, int v, int op){
        update(0, n-1, 1, l, r, v, op);
    }

    int query(int l, int r, int i, int pos){
        prop(i);
        assert(lo[i] == MI && hi[i] == MA);
        if (l == r && l == pos) return t[i];
        int m = (l+r)/2;
        if (pos <= m) return query(l, m, 2*i, pos);
        else return query(m+1, r, 2*i+1, pos);
    }
    int query(int pos){
        return query(0, n-1, 1, pos);
    }
};

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    Segtree seg (n);
    for (int i=0; i<k; i++){
        seg.update(left[i], right[i], height[i], op[i]);
    }
    for (int i=0; i<n; i++){
        finalHeight[i] = seg.query(i);
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 2 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 5 ms 860 KB Output is correct
5 Correct 3 ms 860 KB Output is correct
6 Correct 4 ms 860 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 110 ms 13940 KB Output is correct
3 Correct 139 ms 8532 KB Output is correct
4 Correct 406 ms 21332 KB Output is correct
5 Correct 185 ms 21848 KB Output is correct
6 Correct 179 ms 20316 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 352 KB Output is correct
2 Correct 1 ms 356 KB Output is correct
3 Correct 1 ms 352 KB Output is correct
4 Correct 5 ms 892 KB Output is correct
5 Correct 5 ms 860 KB Output is correct
6 Correct 3 ms 868 KB Output is correct
7 Correct 0 ms 356 KB Output is correct
8 Correct 86 ms 14060 KB Output is correct
9 Correct 138 ms 8284 KB Output is correct
10 Correct 393 ms 21184 KB Output is correct
11 Correct 197 ms 21840 KB Output is correct
12 Correct 180 ms 20188 KB Output is correct
13 Correct 0 ms 344 KB Output is correct
14 Correct 84 ms 13840 KB Output is correct
15 Correct 29 ms 2136 KB Output is correct
16 Correct 497 ms 21328 KB Output is correct
17 Correct 179 ms 20564 KB Output is correct
18 Correct 176 ms 20692 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 564 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 5 ms 860 KB Output is correct
5 Correct 4 ms 860 KB Output is correct
6 Correct 4 ms 960 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 94 ms 13920 KB Output is correct
9 Correct 138 ms 8272 KB Output is correct
10 Correct 400 ms 21328 KB Output is correct
11 Correct 180 ms 21844 KB Output is correct
12 Correct 192 ms 20324 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 88 ms 13884 KB Output is correct
15 Correct 28 ms 2140 KB Output is correct
16 Correct 513 ms 21464 KB Output is correct
17 Correct 180 ms 20564 KB Output is correct
18 Correct 185 ms 20680 KB Output is correct
19 Correct 551 ms 75604 KB Output is correct
20 Correct 568 ms 75600 KB Output is correct
21 Correct 599 ms 75688 KB Output is correct
22 Correct 525 ms 75668 KB Output is correct
23 Correct 580 ms 75588 KB Output is correct
24 Correct 572 ms 75600 KB Output is correct
25 Correct 544 ms 75600 KB Output is correct
26 Correct 562 ms 75600 KB Output is correct
27 Correct 558 ms 75600 KB Output is correct
28 Correct 574 ms 75652 KB Output is correct
29 Correct 528 ms 75600 KB Output is correct
30 Correct 534 ms 75600 KB Output is correct