제출 #836784

#제출 시각아이디문제언어결과실행 시간메모리
836784tengiz05송신탑 (IOI22_towers)C++17
0 / 100
4085 ms2668 KiB
#include "towers.h" #include <bits/stdc++.h> using namespace std; vector<int> h; vector<int> incers; int n; void init(int N, vector<int> H) { n = N; h = H; for (int i = 0; i < n - 1; i++) { if (h[i] < h[i + 1]) { incers.push_back(i); } } incers.push_back(n); } bool processed = false; vector<int> nxt, dow; int max_towers(int l, int r, int D) { if (!processed) { deque<pair<int, int>> st; nxt.resize(n + 1, n); dow.resize(n + 1, n); for (int i = n - 1; i >= 0; i--) { while (!st.empty() && h[st.front().second] <= h[i]) st.pop_front(); st.push_front({h[i], i}); auto p = lower_bound(st.begin(), st.end(), pair{h[i] + D, -1}); if (p != st.end()) { nxt[i] = p->second; } } for (int i = n - 2; i >= 0; i--) { nxt[i] = min(nxt[i], nxt[i + 1]); } st.clear(); for (int i = n - 1; i >= 0; i--) { while (!st.empty() && h[st.front().second] >= h[i]) st.pop_back(); st.push_back({h[i], i}); auto p = lower_bound(st.begin(), st.end(), pair{h[i] - D + 1, -1}); if (p != st.begin()) { p--; dow[i] = p->second; } } for (int i = n - 2; i >= 0; i--) { dow[i] = min(dow[i], dow[i + 1]); } } // for (int i = 0; i < n; i++) { // cout << nxt[i] << " " << dow[i] << "\n"; // } int p = *lower_bound(incers.begin(), incers.end(), l); int s = 0; while (p < r) { if (s % 2 == 0) { p = nxt[p]; if (p <= r) { s++; } } else { p = dow[p]; if (p <= r) { s++; } } } return max(1, s / 2 + 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...