제출 #997386

#제출 시각아이디문제언어결과실행 시간메모리
997386vjudge1Measures (CEOI22_measures)C++17
100 / 100
444 ms50096 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define int ll using vi = vector<int>; using ii = pair<int, int>; const ll INF = 1e18; struct AINT { int n; vi Mi, Ma, Re, Lz; AINT(int N) : n(N), Mi(4 * N, 0), Ma(4 * N, 0), Re(4 * N, 0), Lz(4 * N, 0) {} void prop(int u, int s, int d) { Mi[u] += Lz[u]; Ma[u] += Lz[u]; if(s != d) { Lz[u << 1] += Lz[u]; Lz[u << 1 | 1] += Lz[u]; } Lz[u] = 0; } void update(int l, int r, int v, int u, int s, int d) { prop(u, s, d); if(r < s || d < l) return; if(l <= s && d <= r) { Lz[u] += v; prop(u, s, d); return; } update(l, r, v, u << 1, s, (s + d) >> 1); update(l, r, v, u << 1 | 1, ((s + d) >> 1) + 1, d); Mi[u] = min(Mi[u << 1], Mi[u << 1 | 1]); Ma[u] = max(Ma[u << 1], Ma[u << 1 | 1]); Re[u] = max({Re[u << 1], Re[u << 1 | 1], Ma[u << 1 | 1] - Mi[u << 1]}); } void update(int l, int r, int v) { update(l, r, v, 1, 0, n - 1); } int query() { return Re[1]; } }; struct solver { int n, d, rez; vi V, pozInA; vector<ii> A; set<int> Active; AINT Sol; solver(int N, vi V0, int D) : n(N), d(D), rez(0), V(V0), Sol(N + 1) { for(int i = 0; i < n; ++i) { A.push_back({V[i], i}); } V.push_back(-INF); A.push_back({-INF, n}); ++n; sort(A.begin(), A.end()); pozInA.resize(n); for(int i = 0; i < n; ++i) pozInA[A[i].second] = i; Active.insert(0); } void enable(int p) { int pA = pozInA[p]; auto ant = *(--Active.lower_bound(pA)); /// pozitia anterioriului in A int dist1 = V[p] - A[ant].first, v1 = (d - dist1) / 2; Sol.update(pA, n, v1); auto urm = Active.lower_bound(pA); if(urm != Active.end()) { int purm = *urm; int dist2 = A[purm].first - V[p], v2 = (d - dist2) / 2; int dist_ant = A[purm].first - A[ant].first, vant = (d - dist_ant) / 2; Sol.update(purm, n, v2 - vant); } Active.insert(pA); rez = max(rez, Sol.query()); } }; signed main() { int n, m, d; cin >> n >> m >> d; vi V(n + m); d *= 2; for(int i = 0; i < n + m; ++i) { cin >> V[i]; V[i] *= 2; } solver S(n + m, V, d); for(int i = 0; i < n; ++i) S.enable(i); for(int i = 0; i < m; ++i) { S.enable(i + n); int r = S.rez; cout << r / 2; if(r & 1) cout << ".5 "; else cout << " "; } cout << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...