Submission #1056395

#TimeUsernameProblemLanguageResultExecution timeMemory
1056395tolbiRadio Towers (IOI22_towers)C++17
14 / 100
695 ms37736 KiB
#include "towers.h" #include <bits/stdc++.h> using namespace std; #define tol(bi) ((1LL)<<((int)(bi))) constexpr int MAXN = 1e5; constexpr int LOG = 20; int st[MAXN*4][LOG], tin[MAXN], rev[MAXN*4]; vector<int> tree[MAXN]; map<int,int> hsh; vector<int> H; int query(int l, int r){ int ara = r-l+1; int lg = log2(ara); return min(st[l][lg],st[r-tol(lg)+1][lg]); } int lca(int a, int b){ if (tin[a]>tin[b]) swap(a,b); return rev[query(tin[a],tin[b])]; } int ind; void dfs(int node){ st[ind][0]=ind; rev[ind]=node; tin[node]=ind++; for (auto it : tree[node]){ dfs(it); st[ind++][0]=tin[node]; } } vector<int> leafs; void init(int N, std::vector<int> H) { ::H=H; ind=0; for (int i = 0; i < N; i++){ hsh[H[i]]=i; st[i][0]=-H[i]; } for (int j = 1; j < LOG; j++){ for (int i = 0; i < N; i++){ st[i][j]=1; if (st[i][j-1]==1 || i+tol(j-1)>=N) continue; st[i][j]=min(st[i][j-1],st[i+tol(j-1)][j-1]); } } for (int i = 0; i < N; ++i) { tree[i].clear(); } function<int(int,int)> partition = [&](int l, int r)->int{ if (l==r) return l; int ele = hsh[-query(l,r)]; if (l<=ele-1) tree[ele].push_back(partition(l,ele-1)); if (ele+1<=r) tree[ele].push_back(partition(ele+1,r)); return ele; }; int root = partition(0,N-1); dfs(root); for (int j = 1; j < LOG; j++){ for (int i = 0; i < ind; i++){ st[i][j]=-1; if (st[i][j-1]==-1 || i+tol(j-1)>=ind) continue; st[i][j]=min(st[i][j-1],st[i+tol(j-1)][j-1]); } } for (int i = 0; i < N; ++i) { if (tree[i].size()==0) leafs.push_back(i); } } int max_towers(int L, int R, int D) { if (L==R) return 1; auto ub = lower_bound(leafs.begin(), leafs.end(), R+1); auto lb = lower_bound(leafs.begin(), leafs.end(), L); int ans = ub-lb; if (ub==leafs.begin() || *(ub-1) != R){ int i = R; bool isleaf=true; for (auto it : tree[i]){ if (it<i) isleaf=false; } if (isleaf) ans++; } if (lb==leafs.end() || *lb != L){ int i = L; bool isleaf=true; for (auto it : tree[i]){ if (it>i) isleaf=false; } if (isleaf) ans++; } 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...