제출 #628542

#제출 시각아이디문제언어결과실행 시간메모리
628542dqhungdl송신탑 (IOI22_towers)C++17
4 / 100
4078 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(N, 1); int rs = 0; for (int i = 1; i < N; i++) { for (int j = 0; j < i - 1; j++) if (get(j + 1, i - 1) - D >= max(H[i], H[j])) f[i] = max(f[i], f[j] + 1); rs = max(rs, f[i]); } 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...