Submission #1302946

#TimeUsernameProblemLanguageResultExecution timeMemory
1302946vincentbucourt1Wall (IOI14_wall)C++20
100 / 100
743 ms48880 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; const int OO = (int)1e18; struct SegMonoid { int lo = 0, hi = 0; SegMonoid (int initLo, int initHi) { lo = initLo, hi = initHi; } void combineNew (SegMonoid other) { if (hi < other.lo) { lo = other.lo, hi = other.lo; } else if (other.hi < lo) { lo = other.hi, hi = other.hi; } else { lo = max(lo, other.lo), hi = min(hi, other.hi); } } void print () { cerr << "[" << lo << ", " << hi << "]"; } }; SegMonoid combineSegMonoid (SegMonoid a, SegMonoid b) { return SegMonoid(min(a.lo, b.lo), max(a.hi, b.hi)); } struct Segtree { int numleaves; vector<SegMonoid> tree; Segtree (int n) { numleaves = 1; while (numleaves < n) numleaves *= 2; tree.assign(2*numleaves, SegMonoid(0, 0)); } void pushdown (int node) { if (node < numleaves) { tree[2*node].combineNew(tree[node]); tree[2*node+1].combineNew(tree[node]); } } void update (int node, int nL, int nR, int qL, int qR, SegMonoid newInter) { pushdown(node); if (qL <= nL && nR <= qR) { tree[node].combineNew(newInter); pushdown(node); } else if (nR < qL || qR < nL) { return; } else { int nMid = nL + (nR - nL) / 2; update(2*node, nL, nMid, qL, qR, newInter); update(2*node+1, nMid+1, nR, qL, qR, newInter); tree[node] = combineSegMonoid(tree[2*node], tree[2*node+1]); } } void update (int qL, int qR, SegMonoid newInter) { update(1, 0, numleaves-1, qL, qR, newInter); } int get (int idx) { int node = 1, nL = 0, nR = numleaves-1; while (node < numleaves) { pushdown(node); int nMid = nL + (nR - nL) / 2; if (nL <= idx && idx <= nMid) { nR = nMid; node = 2*node; } else { nL = nMid+1; node = 2*node+1; } } return tree[node].lo; } void dbg () { cerr << "Tree:\n"; for (int h = 0; h <= log2(numleaves); h++) { for (int i = (1 << h); i < (1 << (h+1)); i++) { tree[i].print();cerr << " "; } cerr << "\n"; } cerr << "Wall:\n"; for (int i = 0; i < numleaves; i++) cerr << get(i) << " "; cerr << "\n"; } }; void buildWall(int N, int Q, int typeQ[], int leftQ[], int rightQ[], int heightQ[], int finalHeight[]){ Segtree wall(N); for (int q = 0; q < Q; q++) { if (typeQ[q] == 1) { // add wall.update(leftQ[q], rightQ[q], SegMonoid(heightQ[q], OO)); } else { // rem wall.update(leftQ[q], rightQ[q], SegMonoid(0, heightQ[q])); } } for (int i = 0; i < N; i++) { finalHeight[i] = wall.get(i); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...