Submission #1178267

#TimeUsernameProblemLanguageResultExecution timeMemory
1178267PagodePaivaRadio Towers (IOI22_towers)C++20
11 / 100
176 ms14296 KiB
#include<bits/stdc++.h> #include "towers.h" #include <vector> #define fr first #define sc second using namespace std; const int N = 2010; int v[N]; struct Segtree{ pair <int, int> tree[4*N]; pair <int, int> join(pair <int, int> a, pair <int, int> b){ if(a.fr > b.fr) return a; if(a.fr < b.fr) return b; if(a.sc > b.sc) return a; return b; } void build(int node, int l, int r){ if(l == r){ tree[node] = {v[l], l}; return; } int mid = (l+r)/2; build(2*node, l, mid); build(2*node+1, mid+1, r); tree[node] = join(tree[2*node], tree[2*node+1]); return; } pair <int, int> query(int node, int l, int r, int tl, int tr){ if(l > tr or tl > r) return {-1, 0}; if(l <= tl and tr <= r) return tree[node]; int mid = (tl+tr)/2; return join(query(2*node, l, r, tl, mid), query(2*node+1, l,r, mid+1, tr)); } } seg; int n; void init(int mm, std::vector<int> h) { n = mm; for(int i = 1;i <= n;i++) v[i] = h[i-1]; seg.build(1, 1, n); } int dp[N][N]; int max_towers(int L, int R, int D) { L++; R++; for(int i = L-1;i <= R;i++){ dp[L-1][i] = 0; } for(int i = L;i <= R;i++){ for(int j = i+1;j <= R+1;j++){ if(j == R+1){ dp[i][j] = max(dp[i-1][j], dp[i-1][i]+1); continue; } dp[i][j] = max(dp[i-1][j], (seg.query(1, i+1, j-1, 1, n).first-D >= max(v[i], v[j]) ? dp[i-1][i]+1 : 0)); } } return dp[R][R+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...