제출 #1179518

#제출 시각아이디문제언어결과실행 시간메모리
1179518gygRadio Towers (IOI22_towers)C++20
23 / 100
4053 ms11092 KiB
#include "towers.h" #include <bits/stdc++.h> using namespace std; #define arr array #define vec vector const int N = 1e5 + 5; int n; arr<int, N> h; void init(int _n, vec<int> _h) { n = _n; for (int i = 1; i <= n; i++) h[i] = _h[i - 1]; } int s, f, d; struct Sgt { arr<int, 4 * N> tr; void intl() { tr.fill(0); } void upd(int i, int x, int u = 1, int lw = 1, int hg = n) { if (lw == hg) { tr[u] += x; return; } int md = (lw + hg) / 2; if (i <= md) upd(i, x, 2 * u, lw, md); else upd(i, x, 2 * u + 1, md + 1, hg); tr[u] = max(tr[2 * u], tr[2 * u + 1]); } int qry(int l, int r, int u = 1, int lw = 1, int hg = n) { if (l > r) return 0; if (l <= lw && hg <= r) return tr[u]; int md = (lw + hg) / 2, ans = 0; if (l <= md) ans = max(ans, qry(l, r, 2 * u, lw, md)); if (r > md) ans = max(ans, qry(l, r, 2 * u + 1, md + 1, hg)); return ans; } } sgt; arr<int, N> lf, rg; void prp_cmp() { sgt.intl(); for (int i = 1; i <= n; i++) sgt.upd(i, h[i]); for (int i = 1; i <= n; i++) { int lw = 1, hg = i; while (lw < hg) { int md = (lw + hg + 1) / 2; if (sgt.qry(md, i) >= h[i] + d) lw = md; else hg = md - 1; } lf[i] = (sgt.qry(lw, i) >= h[i] + d) ? lw : 1; lw = i, hg = n; while (lw < hg) { int md = (lw + hg) / 2; if (sgt.qry(i, md) >= h[i] + d) hg = md; else lw = md + 1; } rg[i] = (sgt.qry(i, lw) >= h[i] + d) ? lw : n; } // for (int i = 1; i <= n; i++) { // cout << i << ": " << lf[i] << " " << rg[i] << '\n'; // } } arr<int, N> dp; arr<vec<int>, N> add; void dp_cmp() { sgt.intl(); for (int i = s; i <= f; i++) { for (int j : add[i]) sgt.upd(j, dp[j]); dp[i] = sgt.qry(s, lf[i] - 1) + 1; add[rg[i] + 1].push_back(i); } } int max_towers(int _s, int _f, int _d) { s = _s + 1, f = _f + 1, d = _d; prp_cmp(); dp_cmp(); int ans = 0; for (int i = s; i <= f; i++) ans = max(ans, dp[i]); 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...