제출 #1211923

#제출 시각아이디문제언어결과실행 시간메모리
1211923dzhoz0Wall (IOI14_wall)C++20
100 / 100
549 ms96816 KiB
#include "wall.h" #include<bits/stdc++.h> using namespace std; const int MAXN = 2e6; struct Node { int l = 0, r = INT_MAX; Node() {} Node(int x): l(x), r(x) {} Node(int l, int r): l(l), r(r) {} } st[4 * MAXN + 5]; int a[MAXN + 5]; Node intersect(Node a, Node b) { if(max(a.l, b.l) <= min(a.r, b.r)) return Node(max(a.l, b.l), min(a.r, b.r)); else if(a.r < b.l) return Node(b.l); else return Node(b.r); } void down(int id, int l, int r) { if(l != r) { st[id * 2] = intersect(st[id * 2], st[id]); st[id * 2 + 1] = intersect(st[id * 2 + 1], st[id]); st[id] = Node(); } } void upd(int id, int l, int r, int u, int v, Node x) { down(id, l, r); if(v < l || r < u) return; if(u <= l && r <= v) { st[id] = intersect(st[id], x); down(id, l, r); return; } int mid = (l + r) / 2; upd(id * 2, l, mid, u, v, x); upd(id * 2 + 1, mid + 1, r, u, v, x); st[id] = Node(); } void build(int id, int l, int r) { down(id, l, r); if(l == r) a[l] = st[id].l; else { int mid = (l + r) / 2; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); } } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ for(int i = 0; i < k; i++) { int t = op[i], l = left[i], r = right[i], h = height[i]; l++, r++; upd(1, 1, n, l, r, (t == 1 ? Node(h, INT_MAX) : Node(0, h))); } build(1, 1, n); for(int i = 1; i <= n; i++) finalHeight[i - 1] = a[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...