Submission #1210218

#TimeUsernameProblemLanguageResultExecution timeMemory
1210218madamadam3Wall (IOI14_wall)C++20
100 / 100
679 ms78700 KiB
#include <bits/stdc++.h>
#include "wall.h"
using namespace std;
using ll = long long;

struct SegmentTree {
    int n;
    vector<int> arr, treeMin, treeMax; // lower bound on value, upper bound on value

    void build(int i, int l, int r) {
        if (l + 1 == r) {
          treeMin[i] = treeMax[i] = arr[l];
          return;
        }

        int m = l + (r - l) / 2;
        build(2 * i + 1, l, m);
        build(2 * i + 2, m, r);

        treeMin[i] = max(treeMin[2*i+1], treeMin[2*i+2]);
        treeMax[i] = min(treeMax[2*i+1], treeMax[2*i+2]);
    }

    void apply_update(int i, int minV, int maxV) {
        treeMin[i] = max(treeMin[i], minV);
        treeMax[i] = max(treeMax[i], treeMin[i]);

        treeMax[i] = min(treeMax[i], maxV);
        treeMin[i] = min(treeMin[i], treeMax[i]);
    }

    void push_down(int i) {
        apply_update(2 * i + 1, treeMin[i], treeMax[i]);
        apply_update(2 * i + 2, treeMin[i], treeMax[i]);

        treeMin[i] = 0;
        treeMax[i] = INT_MAX;
    }

    int query(int i, int l, int r, int idx) {
        if (l + 1 == r) return treeMin[i];
        push_down(i);
        int m = l + (r - l) / 2;
        return (idx < m) ? query(2*i+1, l, m, idx) : query(2*i+2, m, r, idx);
    }

    void update(int i, int l, int r, int uL, int uR, int uMin, int uMax) {
        if (r <= uL || uR <= l) return;
        if (uL <= l && r <= uR) {
            apply_update(i, uMin, uMax);
            return;
        }

        push_down(i);
        int m = l + (r - l) / 2;
        update(2 * i + 1, l, m, uL, uR, uMin, uMax);
        update(2 * i + 2, m, r, uL, uR, uMin, uMax);
    }

    SegmentTree(int n) {
        this->n = n;
        this->treeMin.assign(4 * n, 0);
        this->treeMax.assign(4 * n, INT_MAX);

        // build(0, 0, n);
    }
};

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) {
  auto st = SegmentTree(n);

  for (int i = 0; i < k; i++) {
    if (op[i] == 1) { // add
      st.update(0, 0, n, left[i], right[i]+1, height[i], INT_MAX);
    } else if (op[i] == 2) {
      st.update(0, 0, n, left[i], right[i]+1, 0, height[i]);
    }

  }

  for (int i = 0; i < n; i++) {
    // finalHeight[i] = query_sum(i, i);
    finalHeight[i] = st.query(0, 0, n, 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...