Submission #1366552

#TimeUsernameProblemLanguageResultExecution timeMemory
1366552TraianDanciu벽 (IOI14_wall)C++20
100 / 100
331 ms66944 KiB
#include "wall.h"
#include <algorithm>

using namespace std;

const int MAXN = 2000000;
const int INFINIT = 100000;

int answer[MAXN];

struct SegmentTree {
  struct Node {
    int lazymin, lazymax;
  } tree[4 * MAXN];
  int n;

  void build(int node, int left, int right) {
    tree[node] = {INFINIT, 0};
    if(left < right) {
      int middle = (left + right) / 2;
      build(2 * node, left, middle);
      build(2 * node + 1, middle + 1, right);
    }
  }

  void init(int n) {
    this->n = n;
    build(1, 0, n - 1);
  }

  void addLazy(int node, int type, int val) {
    if(type == 1) {
      tree[node].lazymin = max(tree[node].lazymin, val);
      tree[node].lazymax = max(tree[node].lazymax, val);
    } else {
      tree[node].lazymin = min(tree[node].lazymin, val);
      tree[node].lazymax = min(tree[node].lazymax, val);
    }
  }

  void propagate(int node) {
    addLazy(2 * node, 1, tree[node].lazymax);
    addLazy(2 * node, 2, tree[node].lazymin);
    addLazy(2 * node + 1, 1, tree[node].lazymax);
    addLazy(2 * node + 1, 2, tree[node].lazymin);
    tree[node].lazymax = 0;
    tree[node].lazymin = INFINIT;
  }

  void update(int node, int left, int right, int qleft, int qright, int type, int val) {
    if(qleft <= left && right <= qright) {
      addLazy(node, type, val);
    } else {
      propagate(node);
      int middle = (left + right) / 2;
      if(qleft <= middle) {
        update(2 * node, left, middle, qleft, qright, type, val);
      }
      if(middle < qright) {
        update(2 * node + 1, middle + 1, right, qleft, qright, type, val);
      }
    }
  }

  void update(int st, int dr, int type, int val) {
    update(1, 0, n - 1, st, dr, type, val);
  }

  void dfs(int node, int left, int right) {
    if(left == right) {
      answer[left] = tree[node].lazymax;
    } else {
      propagate(node);
      int middle = (left + right) / 2;
      dfs(2 * node, left, middle);
      dfs(2 * node + 1, middle + 1, right);
    }
  }

  void dfs() {
    dfs(1, 0, n - 1);
  }
} aint;

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) {
  aint.init(n);
  for(int i = 0; i < k; i++) {
    aint.update(left[i], right[i], op[i], height[i]);
  }
  aint.dfs();
  for(int i = 0; i < n; i++) {
    finalHeight[i] = answer[i];
  }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...