Submission #1312310

#TimeUsernameProblemLanguageResultExecution timeMemory
1312310ByeWorldRadio Towers (IOI22_towers)C++20
23 / 100
4070 ms5024 KiB
#include "towers.h" #include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pb push_back #define lf ((id)<<1) #define rg ((id<<1)|1) #define md ((l+r)>>1) using namespace std; typedef pair<ll,ll> pii; typedef pair<ll,pii> ipii; const int MAXN = 3e5+100; const int LOG = 19; const ll INF = 2e18+10; const int INF2 = 2e9+10; void chmx(auto &a, auto b){ a = max(a, b); } void chmn(auto &a, auto b){ a = min(a, b); } int n, h[MAXN]; struct seg { int st[4*MAXN]; void bd(int id,int l,int r){ if(l==r){ st[id] = h[l]; return; } bd(lf,l,md); bd(rg,md+1,r); st[id] = max(st[lf], st[rg]); } int upd(int id,int l,int r,int x,int y){ if(l==r && l==x) return st[id] = y; if(r<x || x<l) return st[id]; return st[id] = max(upd(lf,l,md,x,y), upd(rg,md+1,r,x,y)); } int que(int id,int l,int r,int x,int y){ if(x<=l && r<=y) return st[id]; if(r<x || y<l) return 0; return max(que(lf,l,md,x,y), que(rg,md+1,r,x,y)); } } A, B; void init(int N, std::vector<int> H) { n = N; for(int i=1; i<=n; i++){ h[i] = H[i-1]; } B.bd(1,1,n); } int dp[MAXN]; int max_towers(int L, int R, int D) { int l = L+1, r = R+1, d = D; if(l==r || l+1==r) return 1; priority_queue<pii, vector<pii>, greater<pii>> pq; for(int i=L+1; i<=R+1; i++){ while(!pq.empty() && pq.top().fi+d <= h[i]){ int id = pq.top().se; A.upd(1,1,n,id, dp[id]); pq.pop(); } pq.push({h[i], i}); int l=1, r=i-1, mid=0, cnt=-1; while(l<=r){ mid = md; if(B.que(1,1,n,mid,i-1) >= h[i]+d){ cnt = mid; l = mid+1; } else r = mid-1; } dp[i] = 1; if(cnt != -1) dp[i] = A.que(1,1,n,1,cnt-1)+1; } int ANS = 0; for(int i=L+1; i<=R+1; i++) chmx(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...