Submission #1214772

#TimeUsernameProblemLanguageResultExecution timeMemory
1214772dostsRadio Towers (IOI22_towers)C++20
0 / 100
14 ms9260 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 = 2010; int sel = 0; vi edges[LIM]; int dp[LIM][LIM]; int n; vi h; vi vals; void init(int N, std::vector<int> H) { n = N; h = H; for (auto it : h) vals.push_back(it); sort(all(vals)); } int idx(int x) { return upper_bound(all(vals),x)-vals.begin(); } int cartesian(int L,int R) { int mx = -1,pick = -1; for (int i=L;i<=R;i++) { if (h[i] > mx) { pick = i; mx = h[i]; } } if (L < pick) edges[pick].push_back(cartesian(L,pick-1)); if (pick < R) edges[pick].push_back(cartesian(pick+1,R)); return pick; } void dfs(int node,int p,int D) { for (int i=1;i<=n;i++) dp[node][i] = 0; vi opt1(n+1,0),opt2(n+1,0); for (auto it : edges[node]) { if (it == p) continue; dfs(it,node,D); for (int j = 1;j<=n;j++) { if (h[node] >= vals[j-1]+D) { opt1[j] += dp[it][j]; } } } dp[node][idx(h[node])] = 1; for (int i=2;i<=n;i++) dp[node][i]=max(dp[node][i],max(opt1[i],dp[node][i-1])); } int dnq(int L,int R,int D) { for (int i=0;i<=n;i++) edges[i].clear(); int root = cartesian(L,R); dfs(root,root,D); return dp[root][n]; } int max_towers(int L, int R, int D) { return dnq(L,R,D); }
#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...