제출 #628585

#제출 시각아이디문제언어결과실행 시간메모리
628585dqhungdl송신탑 (IOI22_towers)C++17
27 / 100
4038 ms11236 KiB
#include "towers.h" #include <bits/stdc++.h> using namespace std; const int MAX = 1e5 + 5; int N, lg[MAX], peaks[MAX], maxH[MAX][20]; bool isMountain = true; vector<int> H; struct FenwickTree { int n; vector<int> tree; FenwickTree(int _n) { n = _n; tree.resize(n + 5); } void update(int idx, int val) { idx++; for (int i = idx; i <= n; i += i & -i) tree[i] = max(tree[i], val); } int get(int idx) { idx++; int rs = 0; for (int i = idx; i > 0; i -= i & -i) rs = max(rs, tree[i]); return rs; } }; int get(int l, int r) { int k = lg[r - l + 1]; return max(maxH[l][k], maxH[r - (1 << k) + 1][k]); } void init(int _N, vector<int> _H) { N = _N, H = _H; for (int i = 1; i <= N; i++) lg[i] = log2(i); for (int i = 0; i < N; i++) maxH[i][0] = H[i]; for (int i = 1; i < N - 1; i++) peaks[i] = peaks[i - 1] + (H[i] > max(H[i - 1], H[i + 1])); peaks[N - 1] = peaks[N - 2]; for (int t = 1; t <= 18; t++) for (int i = 0; i + (1 << t) - 1 < N; i++) maxH[i][t] = max(maxH[i][t - 1], maxH[i + (1 << (t - 1))][t - 1]); int id = max_element(H.begin(), H.end()) - H.begin(); for (int i = id; i > 0 && isMountain; i--) isMountain &= (H[i] > H[i - 1]); for (int i = id; i < N - 1 && isMountain; i++) isMountain &= (H[i] > H[i + 1]); } int max_towers(int L, int R, int D) { if (isMountain) return get(L, R) - D >= max(H[L], H[R]) ? 2 : 1; if (D == 1) return peaks[R - 1] - peaks[L] + 1; vector<int> bl(R - L + 1, -1), br(R - L + 1, R - L + 1); for (int i = L; i <= R; i++) { int l = L, r = i - 1; while (l <= r) { int mid = (l + r) / 2; if (get(mid, i - 1) - D >= H[i]) { bl[i - L] = mid - L; l = mid + 1; } else r = mid - 1; } l = i + 1, r = R; while (l <= r) { int mid = (l + r) / 2; if (get(i + 1, mid) - D >= H[i]) { br[i - L] = mid - L; r = mid - 1; } else l = mid + 1; } } vector<int> f(R - L + 1, 1); FenwickTree tree(R - L + 1); for (int i = 0; i < R - L + 1; i++) { if (bl[i] != -1) f[i] = tree.get(bl[i]) + 1; tree.update(br[i], f[i]); } return *max_element(f.begin(), f.end()); } //int main() { // freopen("../_input", "r", stdin); // int N, Q; // assert(2 == scanf("%d %d", &N, &Q)); // std::vector<int> H(N); // for (int i = 0; i < N; ++i) { // assert(1 == scanf("%d", &H[i])); // } // init(N, H); // // for (int i = 0; i < Q; ++i) { // int L, R, D; // assert(3 == scanf("%d %d %d", &L, &R, &D)); // printf("%d\n", max_towers(L, R, D)); // } // return 0; //}
#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...