답안 #394792

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
394792 2021-04-27T10:16:48 Z Hegdahl 벽 (IOI14_wall) C++17
100 / 100
941 ms 107732 KB
#pragma GCC optimize("Ofast")
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#ifdef ENABLE_DEBUG
#include <debug.h>
#else
#define DEBUG(...) do {} while (0)
#endif

using namespace std;
using namespace __gnu_pbds;

using ll = long long;
using ull = unsigned long long;
using lll = __int128;
using ulll = unsigned __int128;

using ld = long double;

template<typename T, size_t N> using ar = array<T, N>;

template<typename T, typename Cmp = less<T>>
using iset = tree<T, null_type, Cmp, rb_tree_tag,
		  tree_order_statistics_node_update, allocator<T>>;

#define REPSI(name, start, stop, step) for (ll name = start; name < (ll)stop; name += step)
#define REPS(name, start, stop) REPSI(name, start, stop, 1)
#define REP(name, stop) REPS(name, 0, stop)

#define RREPSI(name, start, stop, step) for (ll name = stop-1; name >= (ll)start; name -= step)
#define RREPS(name, start, stop) RREPSI(name, start, stop, 1)
#define RREP(name, stop) RREPS(name, 0, stop)

template<typename T> void cins(T &first) { cin >> first; }
template<typename T, typename... Ts> void cins(T &first, T &second, Ts&... rest) {
  cin >> first;
  cins(second, rest...);
}

#define GET(type, ...) type __VA_ARGS__; cins(__VA_ARGS__)
#define GETI(...) GET(int, __VA_ARGS__)
#define GETLL(...) GET(ll, __VA_ARGS__)
#define GETS(...) GET(string, __VA_ARGS__)
#define GETD(...) GET(double, __VA_ARGS__)
#define GETC(...) GET(char, __VA_ARGS__)

struct hsh {
  size_t operator()(uint64_t x) const {
    static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
    x += FIXED_RANDOM;
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
  }
};

template<class S, class F>
struct SegTreeBase {
  
  vector<S> values;
  vector<F> queued;
  int lg2, offset;

  static constexpr int log2i(unsigned n) { return 32-__builtin_clz(--n); }
  SegTreeBase(const vector<S> &src)
    : lg2(log2i((int)src.size())), offset(1<<log2i((int)src.size())) {
    values.reserve(2*offset);
    values.resize(offset);
    values.insert(values.end(), src.begin(), src.end());
    values.resize(2*offset);
    queued.resize(offset);
    for (int i = offset-1; i > 0; --i) recalc(i);
  }

  void recalc(int I) {
    assert(I > 0 && I < offset);
    values[I] = values[2*I] * values[2*I+1];
  }

  void push(int I) {
    assert(I > 0 && I < offset);
    values[2*I] = queued[I] * values[2*I];
    values[2*I+1] = queued[I] * values[2*I+1];
    if (2*I < offset) {
      queued[2*I] = queued[I] * queued[2*I];
      queued[2*I+1] = queued[I] * queued[2*I+1];
    }
    queued[I] = F();
  }

  void push_col(int I) {
    assert(I >= offset && I < 2*offset);
    for (int lvl = lg2-1; lvl >= 0; --lvl)
      push((I>>lvl)/2);
  }

  void push_range(int I, int J) {
    assert(I+1 >= offset && I+1 < 2*offset);
    assert(J-1 >= offset && J-1 < 2*offset);
    assert(I+1 < J);
    for (int lvl = lg2-1; lvl >= 0; --lvl) {
      push(((I+1)>>lvl)/2);
      if (I+1 != J-1) push(((J-1)>>lvl)/2);
    }
  }

  void set(int i, S v) {
    assert(i >= 0 && i < offset);
    i += offset;
    push_col(i);
    values[i] = v;
    while (i /= 2) recalc(i);
  }

  void upd_node(int I, const F &f) {
    assert(I > 0 && I < 2*offset);
    values[I] = f * values[I];
    if (I < offset) queued[I] = f * queued[I];
  }

  void upd(int i, const F &f) {
    assert(i >= 0 && i < offset);
    i += offset;
    push_col(i);
    upd_node(i, f);
    while (i/=2) recalc(i);
  }

  void upd(int i, int j, const F &f) {
    assert(i >= 0 && i < offset);
    assert(j >= 0 && j < offset);
    assert(i <= j);
    i += offset-1;
    j += offset+1;
    int oi = i, oj = j;
    push_range(i, j);
    while (i+1 < j) {
      if ((i&1)==0) upd_node(i+1, f);
      if ((j&1)==1) upd_node(j-1, f);
      i >>= 1, j >>= 1;
    }
    i = oi+1, j = oj-1;
    for (int lvl = 1; lvl <= lg2; lvl++) {
      if (__builtin_ctz(i) < lvl) recalc(i >> lvl);
      if (__builtin_ctz(j+1) < lvl) recalc(j >> lvl);
    }
  }

  S qry(int i) {
    assert(i >= 0 && i < offset);
    i += offset;
    push_col(i);
    return values[i];
  }

  S qry(int i, int j) {
    assert(i >= 0 && i < offset);
    assert(j >= 0 && j < offset);
    assert(i <= j);
    i += offset-1;
    j += offset+1;
    push_range(i, j);
    S ls, rs;
    while (i+1 < j) {
      if ((i&1)==0) ls = ls * values[i+1];
      if ((j&1)==1) rs = values[j-1] * rs;
      i >>= 1, j >>= 1;
    }
    return ls * rs;
  }

  template<class Cmp>
  int upper_bound(S t, Cmp cmp) {
    if (cmp(values[1], t)) return offset;
    int lvl = lg2;
    int I = 1;
    S pre;
    while (lvl--) {
      I *= 2;
      push(I/2);
      if (cmp(pre*values[I], t)) {
        pre = pre*values[I];
        ++I;
      }
    }
    return I - offset;
  }

};

struct S {
  ll v = 0;
  S operator*(const S &rhs) const { return *this; }
};

const ll INF = 1LL<<60;

struct F {
  ll mn = INF;
  ll mx = -INF;
  F operator*(const F &rhs) const {
    F ret = rhs;
    ret.mn = min(ret.mn, mn);
    ret.mx = min(ret.mx, mn);
    ret.mn = max(ret.mn, mx);
    ret.mx = max(ret.mx, mx);
    assert(ret.mn >= ret.mx);
    return ret;
  }
  S operator*(const S &rhs) const {
    return {min(max(rhs.v, mx), mn)};
  }
};

using SegTree = SegTreeBase<S, F>;

void buildWall(int n, int q, int op[], int left[], int right[], int height[], int finalHeight[]) {
  vector<S> src(n);
  SegTree st(src);

  REP(qq, q) {
    int i = left[qq];
    int j = right[qq];
    int h = height[qq];
    if (op[qq] == 1) {
      st.upd(i, j, {INF, h});
    } else if (op[qq] == 2) {
      st.upd(i, j, {h, -INF});
    } else assert(false);
  }

  REPS(I, 1, st.offset) st.push(I);

  REP(i, n) finalHeight[i] = st.values[st.offset+i].v;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 2 ms 332 KB Output is correct
3 Correct 2 ms 332 KB Output is correct
4 Correct 7 ms 1100 KB Output is correct
5 Correct 6 ms 1100 KB Output is correct
6 Correct 6 ms 1072 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 166 ms 13860 KB Output is correct
3 Correct 206 ms 8480 KB Output is correct
4 Correct 596 ms 23016 KB Output is correct
5 Correct 453 ms 23564 KB Output is correct
6 Correct 484 ms 21988 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 2 ms 332 KB Output is correct
3 Correct 3 ms 336 KB Output is correct
4 Correct 9 ms 1112 KB Output is correct
5 Correct 6 ms 1100 KB Output is correct
6 Correct 9 ms 972 KB Output is correct
7 Correct 1 ms 204 KB Output is correct
8 Correct 169 ms 13940 KB Output is correct
9 Correct 231 ms 8580 KB Output is correct
10 Correct 590 ms 23004 KB Output is correct
11 Correct 484 ms 23564 KB Output is correct
12 Correct 484 ms 22000 KB Output is correct
13 Correct 1 ms 204 KB Output is correct
14 Correct 174 ms 13928 KB Output is correct
15 Correct 34 ms 2520 KB Output is correct
16 Correct 658 ms 23008 KB Output is correct
17 Correct 491 ms 22436 KB Output is correct
18 Correct 467 ms 22436 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 2 ms 332 KB Output is correct
3 Correct 2 ms 332 KB Output is correct
4 Correct 8 ms 1076 KB Output is correct
5 Correct 6 ms 1100 KB Output is correct
6 Correct 6 ms 1100 KB Output is correct
7 Correct 1 ms 204 KB Output is correct
8 Correct 183 ms 13964 KB Output is correct
9 Correct 208 ms 8516 KB Output is correct
10 Correct 574 ms 22956 KB Output is correct
11 Correct 497 ms 23492 KB Output is correct
12 Correct 447 ms 21996 KB Output is correct
13 Correct 1 ms 204 KB Output is correct
14 Correct 180 ms 14068 KB Output is correct
15 Correct 35 ms 2532 KB Output is correct
16 Correct 600 ms 23064 KB Output is correct
17 Correct 457 ms 22468 KB Output is correct
18 Correct 453 ms 22468 KB Output is correct
19 Correct 900 ms 107704 KB Output is correct
20 Correct 876 ms 107704 KB Output is correct
21 Correct 925 ms 107648 KB Output is correct
22 Correct 880 ms 107692 KB Output is correct
23 Correct 931 ms 107696 KB Output is correct
24 Correct 881 ms 107732 KB Output is correct
25 Correct 866 ms 107672 KB Output is correct
26 Correct 902 ms 107716 KB Output is correct
27 Correct 881 ms 107732 KB Output is correct
28 Correct 901 ms 107696 KB Output is correct
29 Correct 941 ms 107708 KB Output is correct
30 Correct 886 ms 107696 KB Output is correct