Submission #836791

#TimeUsernameProblemLanguageResultExecution timeMemory
836791tengiz05Radio Towers (IOI22_towers)C++17
0 / 100
1342 ms2616 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) { processed = true; deque<pair<int, int>> st; nxt.assign(n + 1, n); dow.assign(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 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...