Submission #806883

#TimeUsernameProblemLanguageResultExecution timeMemory
806883alextodoranMeasures (CEOI22_measures)C++17
100 / 100
166 ms58740 KiB
/** _ _ __ _ _ _ _ _ _ |a ||t ||o d | |o | | __ _| | _ | __| _ | | __ |/_ | __ /__\ / _\| **/ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N_MAX = 200000; const int M_MAX = 200000; const int X_MAX = N_MAX + M_MAX; const ll INF = LLONG_MAX / 2; int N, M, D; int A[N_MAX + 2]; int B[M_MAX + 2]; int Aid[N_MAX + 2]; int Bid[M_MAX + 2]; int X; pair <int, int> aux[X_MAX + 2]; void compress () { for (int i = 1; i <= N; i++) { aux[++X] = make_pair(A[i], i); } for (int i = 1; i <= M; i++) { aux[++X] = make_pair(B[i], N + i); } sort(aux + 1, aux + X + 1); for (int i = 1; i <= X; i++) { if (aux[i].second <= N) { Aid[aux[i].second] = i; } else { Bid[aux[i].second - N] = i; } } } struct SegInfo { ll mx, mn; ll maxDiff; ll lazy; SegInfo () { mx = -INF; mn = +INF; maxDiff = 0; lazy = 0; } void init (const int &val) { mx = mn = val - lazy; maxDiff = 0; } void add (const ll &val) { mx -= val; mn -= val; lazy += val; } }; SegInfo operator + (const SegInfo &A, const SegInfo &B) { SegInfo C; C.mx = max(A.mx, B.mx); C.mn = min(A.mn, B.mn); C.maxDiff = max({A.maxDiff, B.maxDiff, A.mx - B.mn}); C.lazy = 0; return C; } SegInfo segTree[X_MAX * 4 + 2]; void update (int node, int l, int r, int pos, int val) { if (l == r) { segTree[node].init(val); return; } int mid = (l + r) / 2; int left = node * 2, right = node * 2 + 1; segTree[left].add(segTree[node].lazy); segTree[right].add(segTree[node].lazy); if (pos <= mid) { update(left, l, mid, pos, val); segTree[right].add(D); } else { update(right, mid + 1, r, pos, val); } segTree[node] = segTree[left] + segTree[right]; } void update (int pos, int val) { update(1, 1, X, pos, val); } int main () { ios_base::sync_with_stdio(false); cin.tie(0); cin >> N >> M >> D; for (int i = 1; i <= N; i++) { cin >> A[i]; } for (int i = 1; i <= M; i++) { cin >> B[i]; } compress(); for (int i = 1; i <= N; i++) { update(Aid[i], A[i]); } for (int i = 1; i <= M; i++) { update(Bid[i], B[i]); ll t = segTree[1].maxDiff; if (t % 2 == 0) { cout << t / 2 << " "; } else { cout << t / 2 << ".5 "; } } 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...