Submission #628552

#TimeUsernameProblemLanguageResultExecution timeMemory
628552dqhungdl송신탑 (IOI22_towers)C++17
15 / 100
4059 ms9296 KiB
#include "towers.h" #include <bits/stdc++.h> using namespace std; const int MAX = 1e5 + 5; int N, maxH[MAX][20]; bool isMountain = true; vector<int> H; int get(int l, int r) { int k = log2(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 = 0; i < N; i++) maxH[i][0] = H[i]; 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; vector<int> f(R - L + 1, 1); int rs = 0; for (int i = L; i <= R; i++) { for (int j = L; j < i - 1; j++) { if (get(j + 1, i - 1) - D >= max(H[i], H[j])) f[i - L] = max(f[i - L], f[j - L] + 1); } rs = max(rs, f[i - L]); } return rs; } //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...