제출 #58062

#제출 시각아이디문제언어결과실행 시간메모리
58062aome벽 (IOI14_wall)C++17
100 / 100
1530 ms226784 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; const int N = 2000005; struct Node { int min, max; Node() { min = 0, max = 1e9; } Node(int min, int max) : min(min), max(max) {} }; struct SegmentTree { Node T[N << 2]; #define mid ((l + r) >> 1) void upd(int i, int l, int r, int p, Node x) { if (l == r) { T[i] = x; return; } if (mid >= p) upd(i << 1, l, mid, p, x); else upd(i << 1 | 1, mid + 1, r, p, x); T[i].min = max(T[i << 1].min, T[i << 1 | 1].min); T[i].max = min(T[i << 1].max, T[i << 1 | 1].max); } int get1(int i, int l, int r, Node x) { if (l == r) return l; Node y; y.min = max(x.min, T[i << 1 | 1].min); y.max = min(x.max, T[i << 1 | 1].max); if (y.min > y.max) { return get1(i << 1 | 1, mid + 1, r, x); } return get1(i << 1, l, mid, y); } void get2(int i, int l, int r, int L, int R, Node& x) { if (l > R || L > r) return; if (L <= l && r <= R) { x.min = max(x.min, T[i].min); x.max = min(x.max, T[i].max); return; } get2(i << 1, l, mid, L, R, x); get2(i << 1 | 1, mid + 1, r, L, R, x); } #undef mid } IT; struct Event { int v, p, x, y, t; bool operator < (const Event& rhs) const { return v < rhs.v; } }; void buildWall(int n, int m, int op[], int left[], int right[], int height[], int finalHeight[]) { vector<Event> events; for (int i = 0; i < m; ++i) { events.push_back({left[i], i, height[i], op[i], 0}); events.push_back({right[i] + 1, i, height[i], op[i], 1}); } sort(events.begin(), events.end()); int ptr = 0; for (int i = 0; i < n; ++i) { // cout << "#at " << i << '\n'; while (ptr < 2 * m && events[ptr].v <= i) { if (events[ptr].t == 0) { if (events[ptr].y == 2) { // cout << "#add2 " << events[ptr].p << '\n'; IT.upd(1, 0, m - 1, events[ptr].p, Node(0, events[ptr].x)); } else { // cout << "#add1 " << events[ptr].p << '\n'; IT.upd(1, 0, m - 1, events[ptr].p, Node(events[ptr].x, 1e9)); } } else { // cout << "#del " << events[ptr].p << '\n'; IT.upd(1, 0, m - 1, events[ptr].p, Node()); } ++ptr; } int v, L, R; if (IT.T[1].min <= IT.T[1].max) { L = IT.T[1].min, R = IT.T[1].max, v = 0; } else { int p = IT.get1(1, 0, m - 1, Node()); // cout << "#p " << p << '\n'; v = height[p]; Node x = Node(); IT.get2(1, 0, m - 1, p + 1, m - 1, x); L = x.min, R = x.max; } // cout << v << ' ' << L << ' ' << R << '\n'; if (v < L) finalHeight[i] = L; else if (v > R) finalHeight[i] = R; else finalHeight[i] = v; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...