Submission #1056203

#TimeUsernameProblemLanguageResultExecution timeMemory
1056203tolbiRadio Towers (IOI22_towers)C++17
0 / 100
4067 ms41032 KiB
#include "towers.h" #include <bits/stdc++.h> using namespace std; #define tol(bi) ((1LL)<<((int)(bi))) constexpr int MAXN = 1e5; constexpr int LOG = 23; 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]; } } 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]); } } function<int(int,int)> partition = [&](int l, int r)->int{ if (l==r) return l; int ele = hsh[-query(l,r)]; tree[ele].clear(); 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]); } } } int max_towers(int L, int R, int D) { vector<int> leafs; for (int i = L; i <= R; ++i) { bool isleaf=true; for (auto it : tree[i]){ if (it>=L && it<=R) isleaf=false; } if (isleaf) leafs.push_back(i); } sort(leafs.begin(), leafs.end(), [&](int a, int b){ return tin[a]<tin[b]; }); int curn = leafs[0]; int sz = 1; for (int i = 1; i < leafs.size(); i++){ int ara = lca(curn,leafs[i]); if (max(H[leafs[i]],H[curn]) <= H[ara]-D){ sz++; curn=leafs[i]; } else if (sz==1 && H[curn]>H[leafs[i]]){ curn=leafs[i]; } } return sz; }

Compilation message (stderr)

towers.cpp: In function 'int max_towers(int, int, int)':
towers.cpp:79:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   79 |  for (int i = 1; i < leafs.size(); i++){
      |                  ~~^~~~~~~~~~~~~~
#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...