Submission #159312

#TimeUsernameProblemLanguageResultExecution timeMemory
159312TAISA_Wall (IOI14_wall)C++14
8 / 100
181 ms8160 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using P = pair<int, int>; struct Segtree { int n; vector<int> s1, s2; Segtree(int n_) { n = 1; while (n < n_) { n <<= 1; } s1.resize(2 * n, 0); s2.resize(2 * n, 998244353); } void upd(int a, int b, P x, int t, int k, int l, int r) { if (b <= l || r <= a) { return; } if (a <= l && r <= b) { if (x.second == 1) { if (s1[k] < x.first) { s1[k] = x.first; } } else { if (s2[k] > x.first) { s2[k] = x.first; } } return; } upd(a, b, x, t, k << 1, l, (l + r) >> 1); upd(a, b, x, t, k << 1 | 1, (l + r) >> 1, r); } void upd(int a, int b, P x, int t) { upd(a, b, x, t, 1, 0, n); } pair<int, int> get(int k) { k += n; int r1 = s1[k], r2 = s2[k]; k >>= 1; while (k > 0) { r1 = max(r1, s1[k]); r2 = min(r2, s2[k]); k >>= 1; } return make_pair(r1, r2); } }; void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) { if (k <= 5000 && n <= 10000) { for (int i = 0; i < n; i++) { finalHeight[i] = 0; } for (int i = 0; i < k; i++) { for (int j = left[i]; j <= right[i]; j++) { if (op[i] == 1) { finalHeight[j] = max(finalHeight[j], height[i]); } else { finalHeight[j] = min(finalHeight[j], height[i]); } } } } else { Segtree seg(n); for (int i = 0; i < k; i++) { seg.upd(left[i], right[i] + 1, P(height[i], op[i]), i); } for (int i = 0; i < n; i++) { pair<int, int> p = seg.get(i); cout << p.first << " " << p.second << endl; finalHeight[i] = min(p.first, p.second); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...