Submission #1232128

#TimeUsernameProblemLanguageResultExecution timeMemory
1232128VMaksimoski008Radio Towers (IOI22_towers)C++20
23 / 100
4051 ms12004 KiB
#include "towers.h" #include <bits/stdc++.h> using namespace std; const int mxn = 1e5 + 5; int a[mxn], n, T[mxn][20]; int query(int l, int r) { int k = __lg(r - l + 1); return max( T[l][k], T[r-(1<<k)+1][k] ); } void init(int _n, vector<int> H) { n = _n; for(int i=0; i<n; i++) { a[i] = H[i]; T[i][0] = a[i]; } for(int j=1; j<20; j++) for(int i=0; i+(1<<j)-1<n; i++) T[i][j] = max( T[i][j-1], T[i+(1<<(j-1))][j-1] ); } int max_towers(int L, int R, int D) { int ans = 1; set<int> st; vector<pair<int, int> > ord; for(int i=L; i<=R; i++) ord.push_back({ a[i], i }); sort(ord.begin(), ord.end()); for(auto [h, id] : ord) { if(st.empty()) { st.insert(id); continue; } int ok = 1; auto it = st.lower_bound(id); if(it != st.end()) { if(*it == id + 1) { ok = 0; } else { int mx = query(id+1, *it-1); if(max(a[id], a[*it]) > mx - D) ok = 0; } } if(it != st.begin()) { --it; if(*it == id - 1) { ok = 0; } else { int mx = query(*it+1, id-1); if(max(a[id], a[*it]) > mx - D) ok = 0; } } if(ok) { st.insert(id); ans++; } } return ans; }
#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...