제출 #785326

#제출 시각아이디문제언어결과실행 시간메모리
785326vjudge1송신탑 (IOI22_towers)C++17
27 / 100
4046 ms13204 KiB
#include "towers.h" #include <bits/stdc++.h> using namespace std; int N, p; vector<int> H; void init(int n, vector<int> h) { N = n, H = h, p = -1; for (int i = 0; i < N; i++) { if ((i == 0 || H[i] > H[i - 1]) && (i == N - 1 || H[i] > H[i + 1])) { p = i; } } for (int i = 0; i < p; i++) { if (H[i] > H[i + 1]) { p = -1; return; } } for (int i = p + 1; i < N; i++) { if (H[i - 1] < H[i]) { p = -1; return; } } } int max_towers(int L, int R, int D) { if (p != -1) { int l = upper_bound(H.begin(), H.begin() + p, H[p] - D) - H.begin() - 1; int r = lower_bound(H.begin() + p, H.end(), H[p] - D, [&](int x, int y) {return x > y;}) - H.begin(); return (L <= l && r <= R) ? 2 : 1; } vector<int> lg(N + 1); for (int i = 2; i <= N; i++) { lg[i] = lg[i / 2] + 1; } vector st(N, vector<int>(lg[N] + 1)); for (int i = 0; i < N; i++) { st[i][0] = i; } auto f = [&](int i, int j) { if (i == -1) { return j; } if (j == -1) { return i; } return H[i] > H[j] ? i : j; }; for (int j = 0; j < lg[N]; j++) { for (int i = 0; i + (2 << j) <= N; i++) { st[i][j + 1] = f(st[i][j], st[i + (1 << j)][j]); } } auto query = [&](int l, int r) { if (l == r) { return -1; } int k = lg[r - l]; return f(st[l][k], st[r - (1 << k)][k]); }; if (D == 1 && 0) { auto rec = [&](auto rec, int l, int r) -> int { if (l + 1 <= r) { return r - l; } int m = query(l, r); return rec(rec, l, m) + rec(rec, m + 1, r); }; return rec(rec, L, R + 1); } vector<int> l(N, -1), r(N, N); for (int i = 0; i < N; i++) { if (H[query(0, i)] >= H[i] + D) { int lo = 0, hi = i - 1; while (lo < hi) { int mi = (lo + hi + 1) / 2; if (H[query(mi, i)] >= H[i] + D) { lo = mi; } else { hi = mi - 1; } } l[i] = lo; } if (H[query(i + 1, N)] >= H[i] + D) { int lo = i + 1, hi = N - 1; while (lo < hi) { int mi = (lo + hi) / 2; if (H[query(i + 1, mi + 1)] >= H[i] + D) { hi = mi; } else { lo = mi + 1; } } r[i] = lo; } } vector<int> dp(N + 1), t(N + 1); for (int i = L; i <= R; i++) { t[i + 1] = max(t[i + 1], t[i]); dp[i + 1] = max(dp[i], t[l[i] + 1] + 1); if (r[i] < N) { t[r[i] + 1] = max(t[r[i] + 1], dp[i + 1]); } } return dp[R + 1]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...