제출 #854244

#제출 시각아이디문제언어결과실행 시간메모리
854244thinknoexit벽 (IOI14_wall)C++17
24 / 100
470 ms29692 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 2000001; struct A { int mx, mn; } tree[4 * N], lazy[4 * N]; int n; int ans[N]; void build(int now = 1, int l = 1, int r = n) { tree[now].mx = lazy[now].mx = 0; tree[now].mn = lazy[now].mn = 1e9; if (l == r) return; int mid = (l + r) / 2; build(2 * now, l, mid), build(2 * now + 1, mid + 1, r); } void lzy(int now, int l, int r) { if (lazy[now].mx != 0) { if (lazy[now].mx > tree[now].mx) { tree[now].mx = lazy[now].mx; tree[now].mn = 1e9; } if (l != r) { if (lazy[now].mx > lazy[2 * now].mx) { lazy[2 * now].mx = lazy[now].mx; lazy[2 * now].mn = 1e9; } if (lazy[now].mx > lazy[2 * now + 1].mx) { lazy[2 * now + 1].mx = lazy[now].mx; lazy[2 * now + 1].mn = 1e9; } } lazy[now].mx = 0; } if (lazy[now].mn != 1e9) { if (lazy[now].mn < tree[now].mx) { tree[now].mx = lazy[now].mn; } tree[now].mn = min(tree[now].mn, lazy[now].mn); if (l != r) { if (lazy[now].mn < lazy[2 * now].mx) { lazy[2 * now].mx = lazy[now].mn; } lazy[2 * now].mn = min(lazy[2 * now].mn, lazy[now].mn); if (lazy[now].mn < lazy[2 * now + 1].mx) { lazy[2 * now + 1].mx = lazy[now].mn; } lazy[2 * now + 1].mn = min(lazy[2 * now + 1].mn, lazy[now].mn); } lazy[now].mn = 1e9; } } void clear(int now = 1, int l = 1, int r = n) { lzy(now, l, r); if (l == r) { ans[l - 1] = tree[now].mx; return; } int mid = (l + r) / 2; clear(2 * now, l, mid), clear(2 * now + 1, mid + 1, r); } void update1(int ql, int qr, int v, int now = 1, int l = 1, int r = n) { lzy(now, l, r); if (l > qr || r < ql) return; if (ql <= l && r <= qr) { lazy[now].mx = v; lzy(now, l, r); return; } int mid = (l + r) / 2; update1(ql, qr, v, 2 * now, l, mid), update1(ql, qr, v, 2 * now + 1, mid + 1, r); } void update2(int ql, int qr, int v, int now = 1, int l = 1, int r = n) { lzy(now, l, r); if (l > qr || r < ql) return; if (ql <= l && r <= qr) { lazy[now].mn = v; lzy(now, l, r); return; } int mid = (l + r) / 2; update2(ql, qr, v, 2 * now, l, mid), update2(ql, qr, v, 2 * now + 1, mid + 1, r); } void buildWall(int NN, int k, int o[], int l[], int r[], int h[], int finalHeight[]) { n = NN; build(); for (int i = 0;i < k;i++) { if (o[i] == 1) { update1(l[i] + 1, r[i] + 1, h[i]); } else { update2(l[i] + 1, r[i] + 1, h[i]); } } clear(); for (int i = 0;i < n;i++) { finalHeight[i] = ans[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...