제출 #785415

#제출 시각아이디문제언어결과실행 시간메모리
785415vjudge1송신탑 (IOI22_towers)C++17
4 / 100
4094 ms3472 KiB
#include "towers.h" #include <bits/stdc++.h> using namespace std; int N, p; vector<int> H, pfs(N + 1); 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; } } pfs.resize(N + 1); for (int i = 0; i < N; i++) { pfs[i + 1] = pfs[i] + ((i == 0 || H[i] < H[i - 1]) && (i == N - 1 || H[i] < H[i + 1])); } } int max_towers(int L, int R, int D) { if (L == R) { return 1; } 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; } if (D == 1) { int ans = pfs[R] - pfs[L + 1]; if (H[L] < H[L + 1]) { ans++; } if (H[R] < H[R - 1]) { ans++; } return ans; } 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] = H[i]; } for (int j = 0; j < lg[N]; j++) { for (int i = 0; i + (2 << j) <= N; i++) { st[i][j + 1] = max(st[i][j], st[i + (1 << j)][j]); } } auto query = [&](int l, int r) { if (l == r) { return 0; } int k = lg[r - l]; return max(st[l][k], st[r - (1 << k)][k]); }; vector<int> l(N, -1), r(N, N); for (int i = 0; i < N; i++) { if (query(0, i) >= H[i] + D) { int lo = 0, hi = i - 1; while (lo < hi) { int mi = (lo + hi + 1) / 2; if (query(mi, i) >= H[i] + D) { lo = mi; } else { hi = mi - 1; } } l[i] = lo; } if (query(i + 1, N) >= H[i] + D) { int lo = i + 1, hi = N - 1; while (lo < hi) { int mi = (lo + hi) / 2; if (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...