Submission #1304415

#TimeUsernameProblemLanguageResultExecution timeMemory
1304415AMnuMeasures (CEOI22_measures)C++20
0 / 100
161 ms25464 KiB
#include <bits/stdc++.h> #define fi first #define se second using namespace std; typedef pair<int,int> pii; typedef long long ll; const int MAXN = 2e5+5; const ll INF = 1e15; int N, M, D, P[MAXN]; pii A[MAXN]; struct seg { ll ans=0, mn=INF, mx=-INF, lz=0; int cnt=0; } tre[MAXN*4]; seg join(seg x,seg y) { seg z; if (x.cnt == 0) return y; if (y.cnt == 0) return x; z.cnt = x.cnt+y.cnt; z.mn = min(x.mn,y.mn); z.mx = max(x.mx,y.mx); z.ans = max(x.ans,y.ans); if (x.cnt > 0 && y.cnt > 0) { z.ans = max(x.mx-y.mn,z.ans); } return z; } void debug(int id=1,int l=1,int r=N+M) { cout << l << " " << r << " " << tre[id].ans << " " << tre[id].mn << " " << tre[id].mx << "\n"; if (l == r) return; int m = (l+r)/2; debug(id*2,l,m); debug(id*2+1,m+1,r); } int query(int x,int id=1,int l=1,int r=N+M) { if (l > x) return 0; if (r <= x) return tre[id].cnt; int m = (l+r)/2; return query(x,id*2,l,m)+query(x,id*2+1,m+1,r); } void down(int id) { if (tre[id].lz == 0) return; if (tre[id*2].cnt > 0) { tre[id*2].mn -= tre[id].lz; tre[id*2].mx -= tre[id].lz; } if (tre[id*2+1].cnt > 0) { tre[id*2+1].mn -= tre[id].lz; tre[id*2+1].mx -= tre[id].lz; } tre[id].lz = 0; } void update(int x,int id=1,int l=1,int r=N+M) { if (tre[id].cnt == 0) return; if (r < x) return; if (l >= x) { tre[id].mn -= D; tre[id].mx -= D; tre[id].lz += D; return; } down(id); int m = (l+r)/2; update(x,id*2,l,m); update(x,id*2+1,m+1,r); tre[id] = join(tre[id*2],tre[id*2+1]); } void add(int x,ll y,int id=1,int l=1,int r=N+M) { if (l == r) { tre[id].mn = y; tre[id].mx = y; tre[id].cnt++; return; } down(id); int m = (l+r)/2; if (x <= m) { add(x,y,id*2,l,m); } else { add(x,y,id*2+1,m+1,r); } tre[id] = join(tre[id*2],tre[id*2+1]); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> M >> D; for (int i=1;i<=N+M;i++) { cin >> A[i].fi; A[i].se = i; } sort(A+1,A+N+M+1); for (int i=1;i<=N+M;i++) { P[A[i].se] = i; } for (int i=1;i<=N+M;i++) { int x = query(P[i]-1); // cout << "\nx = " << A[P[i]].fi-x*D << "\n"; add(P[i],A[P[i]].fi-x*D); update(P[i]+1); // debug(); if (i <= N) continue; cout << tre[1].ans/2; if (tre[1].ans % 2 == 1) { cout << ".5"; } cout << " "; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...