Submission #1234277

#TimeUsernameProblemLanguageResultExecution timeMemory
1234277dostsRadio Towers (IOI22_towers)C++20
23 / 100
4069 ms11160 KiB
#include "towers.h" #include <bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2") //#define int long long #define pii pair<int,int> #define vi vector<int> #define ff first #define ss second #define sp << " " << #define all(x) x.begin(),x.end() #define big(x) ((int)(x.size())) using namespace std; const int MOD = 1e9+7, inf = 2e9,LIM = 2001; vi h; int up[100001][18]; int rmq(int l,int r) { if (l > r) return -inf; int lg = __lg(r-l+1); return max(up[l][lg],up[r-(1<<lg)+1][lg]); } void init(int N, std::vector<int> H) { h = H; for (int i = 0;i<N;i++) up[i][0] = H[i]; for (int i=1;i<=17;i++) { for (int j=0;j+(1<<(i-1))<N;j++) up[j][i] = max(up[j][i-1],up[j+(1<<(i-1))][i-1]); } } int max_towers(int L, int R, int D) { int ans = 0; vector<pii> ps; for (int j=L;j<=R;j++) { ps.push_back({h[j],j}); } sort(all(ps)); set<int> taken; for (auto& [v,p] : ps) { int fl = 1; auto it = taken.upper_bound(p); auto it2 = taken.lower_bound(p); if (it != taken.end()) { int mx = rmq(p+1,*it-1); if (mx < h[p]+D || mx < h[*it]+D) fl = 0; } if (it2 != taken.begin()) { --it2; int mx = rmq(*it2+1,p-1); if (mx < h[p]+D || mx < h[*it2]+D) fl = 0; } if (fl) { ans++; taken.insert(p); } } 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...