제출 #1203534

#제출 시각아이디문제언어결과실행 시간메모리
1203534Quentolosse벽 (IOI14_wall)C++20
100 / 100
397 ms81612 KiB
#include "wall.h"

#include <bits/stdc++.h>

#define int long long

using namespace std;

struct Noeud {
    int mini = 1e9, maxi = 0;
    Noeud(int _mn = 1e9, int _mx = 0) {
        mini = _mn;
        maxi = _mx;
    }
};

Noeud fusion(Noeud avant, Noeud apres) {
    Noeud ret(min(avant.mini, apres.mini), max(avant.maxi, apres.maxi));

    if (apres.mini < ret.maxi) {
        ret.maxi = apres.mini;
    }
    if (apres.maxi > ret.mini) {
        ret.mini = apres.maxi;
    }

    return ret;
}

struct segtree {
    int taille = 1;
    vector<Noeud> tree;

    segtree(int _n) {
        while(taille < _n) taille <<= 1;
        
        tree.resize(taille*2);
    }

    void prop(int pos) {
        if (pos < taille) {
            tree[2*pos] = fusion(tree[2*pos], tree[pos]);
            tree[2*pos+1] = fusion(tree[2*pos+1], tree[pos]);
            tree[pos] = Noeud();
        }
    }

    void modif(int lr, int rr, int l, int r, int pos, Noeud m) {
        if (r <= lr || l >= rr) {
            return;
        }

        if (l >= lr && r <= rr) {
            tree[pos] = fusion(tree[pos], m);
            return;
        }

        prop(pos);

        int mid = (l+r)/2;

        modif(lr, rr, l, mid, 2*pos, m);
        modif(lr, rr, mid, r, 2*pos+1, m);
    }

};

void buildWall(signed n, signed k, signed op[], signed left[], signed right[], signed height[], signed finalHeight[]){

    segtree mur(n);

    for (int i = 0; i < k; i++)
    {
        if (op[i] == 1) {
            mur.modif(left[i], right[i]+1, 0, mur.taille, 1, {(int)1e9, height[i]});
        }
        else {
            mur.modif(left[i], right[i]+1, 0, mur.taille, 1, {height[i], 0});
        }
    }

    for (int i = 0; i < mur.taille; i++)
    {
        mur.prop(i);
    }
    
    for (int i = 0; i < n; i++)
    {
        Noeud actuel = mur.tree[mur.taille + i];
        finalHeight[i] = actuel.maxi;
    }    
    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...