Submission #1022856

#TimeUsernameProblemLanguageResultExecution timeMemory
1022856vjudge1Radio Towers (IOI22_towers)C++17
23 / 100
4102 ms516544 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; const int maxn = 1e5 + 100; int n; int a[maxn]; int t[maxn]; int dp[maxn]; vector<pii> g[maxn]; int l[maxn]; int r[maxn]; void upd(int i, int x){ for(; i <= n; i |= (i + 1)) t[i] = max(t[i], x); } int get(int i){ int res = 0; for(; i > 0; i = (i & (i + 1)) - 1) res = max(res, t[i]); return res; } void init(int N, std::vector<int> H){ n = N; for(int i = 1; i <= n; i++){ a[i] = H[i-1]; } } int max_towers(int L, int R, int D){ L++; R++; for(int i = 1; i <= n; i++){ t[i] = 0; g[i].clear(); } vector<int> v; for(int i = L; i <= R; i++){ while(v.size() && a[v.back()] <= a[i]) v.pop_back(); v.push_back(i); l[i] = L - 1; for(int tl = 0, tr = v.size() - 1; tl <= tr;){ int mid = (tl + tr) >> 1; if(a[v[mid]] - D < a[i]) tr = mid - 1; else tl = mid + 1, l[i] = v[mid]; } } v.clear(); for(int i = R; i >= L; i--){ while(v.size() && a[v.back()] <= a[i]) v.pop_back(); v.push_back(i); r[i] = R + 1; for(int tl = 0, tr = v.size() - 1; tl <= tr;){ int mid = (tl + tr) >> 1; if(a[v[mid]] - D < a[i]) tr = mid - 1; else tl = mid + 1, r[i] = v[mid]; } } int ans = 0; for(int i = L; i <= R; i++){ for(auto [p, x]: g[i]){ upd(p, x); } dp[i] = get(l[i]) + 1; g[r[i]].push_back({i, dp[i]}); ans = max(ans, dp[i]); } 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...