제출 #1354465

#제출 시각아이디문제언어결과실행 시간메모리
1354465Zone_zonee벽 (IOI14_wall)C++20
0 / 100
124 ms102172 KiB
#include <bits/stdc++.h>
#include "wall.h"
const int N = 2e6+10;

int op(int o, int a, int b){
  return (o == 1 ? std::max(a, b) : std::min(a, b));
}
struct lazy_seg{
  int seg[4*N];
  std::pair<int, int> lazy[4*N];
  lazy_seg(){
    std::memset(seg, 0, sizeof seg);
    for(int i = 0; i < 4*N; ++i) lazy[i] = {-1, -1};
  }
  void push(int p, int l, int r){
    if(l > r || lazy[p] == std::make_pair(-1, -1)) return;
    if(l != r){
      seg[p*2] = op(lazy[p].first, seg[p*2], lazy[p].second);
      seg[p*2+1] = op(lazy[p].first, seg[p*2+1], lazy[p].second);
      lazy[p*2] = lazy[p*2+1] = lazy[p];
    }
    lazy[p] = {-1, -1};
  }
  void upd(int p, int l, int r, int wl, int wr, int val, int o){
    if(l > r || l > wr || r < wl) return;
    push(p, l, r);
    if(wl <= l && r <= wr){
      seg[p] = op(o, val, seg[p]);
      lazy[p] = {o, val};
      push(p, l, r);
      return;
    }
    int mid = (l+r)>>1;
    upd(p*2, l, mid, wl, wr, val, o);
    upd(p*2+1, mid+1, r, wl, wr, val, o);
    seg[p] = op(3-o, seg[p*2], seg[p*2+1]);
  }
  int get(int idx, int p, int l, int r){
    push(p, l, r);
    if(l == r) return seg[p];
    int mid = (l+r)>>1;
    if(idx <= mid) return get(idx, p*2, l, mid);
    return get(idx, p*2+1, mid+1, r);
  }
};
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
  lazy_seg seg;
  for(int i = 0; i < k; ++i){
    seg.upd(1, 1, n, left[i]+1, right[i]+1, height[i], op[i]);
  }
  for(int i = 1; i <= n; ++i){
    finalHeight[i-1] = seg.get(i, 1, 1, n);
  }
}

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