Submission #1077593

#TimeUsernameProblemLanguageResultExecution timeMemory
1077593HanksburgerRadio Towers (IOI22_towers)C++17
17 / 100
877 ms30920 KiB
#include "towers.h" #include <bits/stdc++.h> using namespace std; int seg[400005], order[100005], a[100005], n; vector<int> h, seglist[400005]; set<int> s; bool cmp(int x, int y) { return h[x]<h[y]; } void build(int i, int l, int r) { if (l==r) { if (l==-1 || l==n) seg[i]=2e9; else seg[i]=h[l]; return; } int m=(l+r+2)/2-1; build(i*2, l, m); build(i*2+1, m+1, r); seg[i]=max(seg[i*2], seg[i*2+1]); } int query(int i, int l, int r, int ql, int qr) { if (ql<=l && r<=qr) return seg[i]; int m=(l+r+2)/2-1, res=0; if (ql<=m && l<=qr) res=max(res, query(i*2, l, m, ql, qr)); if (ql<=r && m<qr) res=max(res, query(i*2+1, m+1, r, ql, qr)); return res; } void buildlist(int i, int l, int r) { if (l==r) { seglist[i].push_back(a[l]); //cout << i << ' ' << a[l] << '\n'; return; } int m=(l+r)/2; buildlist(i*2, l, m); buildlist(i*2+1, m+1, r); for (int x:seglist[i*2]) seglist[i].push_back(x); for (int x:seglist[i*2+1]) seglist[i].push_back(x); sort(seglist[i].begin(), seglist[i].end()); } int querylist(int i, int l, int r, int ql, int qr, int x) { if (ql<=l && r<=qr) { int ind=lower_bound(seglist[i].begin(), seglist[i].end(), x)-seglist[i].begin(); //cout << l << ' ' << r << ": "; //for (int x:seglist[i]) // cout << x << ' '; //cout << " " << ind << '\n'; return seglist[i].size()-ind; } int m=(l+r)/2, res=0; if (ql<=m && l<=qr) res+=querylist(i*2, l, m, ql, qr, x); if (ql<=r && m<qr) res+=querylist(i*2+1, m+1, r, ql, qr, x); return res; } void init(int N, vector<int> H) { n=N; h=H; build(1, -1, n); for (int i=0; i<n; i++) order[i]=i; sort(order, order+n, cmp); s.insert(-2); s.insert(n+1); for (int i=0; i<n; i++) { int ind=order[i]; auto it=s.lower_bound(ind); int l=*prev(it), r=*it; int res1=(ind-l==1?0:query(1, -1, n, l+1, ind-1)); int res2=(r-ind==1?0:query(1, -1, n, ind+1, r-1)); a[ind]=min(res1, res2)-h[ind]; s.insert(ind); } buildlist(1, 0, n-1); } int max_towers(int l, int r, int d) { return querylist(1, 0, n-1, 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...