제출 #503313

#제출 시각아이디문제언어결과실행 시간메모리
503313InternetPerson10벽 (IOI14_wall)C++17
100 / 100
1018 ms234976 KiB
#include "wall.h"
#include <bits/stdc++.h>

using namespace std;

int BIG = 123456789;

vector<int> ans;

struct SegTree {
    int val = 0;
    int lx, rx, mid;
    int lb = 0, rb = BIG; // bounds
    SegTree *ls = nullptr, *rs = nullptr;
    SegTree(int l, int r) {
        lx = l;
        rx = r;
        mid = (lx + rx)/2;
        if(r - l > 1) {
            int mid = (l + r)/2;
            ls = new SegTree(l, mid);
            rs = new SegTree(mid, r);
        }
    }
    void updateRight(int k) { // Min value, pushes everything on the right
        if(k >= rb) return;
        val = min(val, k);
        if(k >= lb) {
            rb = k;
            return;
        }
        lb = rb = k;
    }
    void updateLeft(int k) { // Max value, pushes everything on the left
        if(k <= lb) return;
        val = max(val, k);
        if(k <= rb) {
            lb = k;
            return;
        }
        lb = rb = k;
    }
    void prop() {
        //cout << "Nice one " << lx << ' ' << rx << ' ' << lb << ' ' << rb << ' '<< val <<"\n";
        if(ls == nullptr) return;
        ls->updateLeft(lb); 
        ls->updateRight(rb);
        rs->updateLeft(lb); 
        rs->updateRight(rb);
        lb = 0; rb = BIG;
    }
    void setMin(int l, int r, int k) {
        prop();
        if(l >= rx || lx >= r) return;
        if(l <= lx && rx <= r) {
            updateRight(k);
            return;
        }
        ls->setMin(l, r, k);
        rs->setMin(l, r, k);
    }
    void setMax(int l, int r, int k) {
        prop();
        if(l >= rx || lx >= r) return;
        if(l <= lx && rx <= r) {
            updateLeft(k);
            return;
        }
        ls->setMax(l, r, k);
        rs->setMax(l, r, k);
    }
    void getAll() {
        prop();
        if(rx - lx == 1) {
            ans[lx] = val;
            return;
        }
        ls->getAll();
        rs->getAll();
    }
};

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    int siz = 1;
    while(siz <= n) siz *= 2;
    SegTree st(0, siz);
    ans.resize(siz);
    for(int i = 0; i < k; i++) {
        //cout << "Doing " << i << '\n';
        if(op[i] == 2) st.setMin(left[i], right[i]+1, height[i]);
        if(op[i] == 1) st.setMax(left[i], right[i]+1, height[i]);
    }
    st.getAll();
    for(int i = 0; i < n; i++) finalHeight[i] = ans[i];
    return;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...