제출 #1240378

#제출 시각아이디문제언어결과실행 시간메모리
124037812345678Measures (CEOI22_measures)C++20
100 / 100
147 ms58540 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const ll nx=4e5+5, inf=4e18; ll n, m, D, a[nx], b[nx], dp[nx]; vector<pair<ll, int>> srt; struct segtree { struct node { ll ans, x, y, cnt; node(ll ans=0, ll x=0, ll y=0, ll cnt=0): ans(ans), x(x), y(y), cnt(cnt){} } d[4*nx]; void merge(int l, int r, int i) { d[i].ans=max({-inf, d[2*i].ans, d[2*i+1].ans, d[2*i].x+(d[2*i+1].y+d[2*i].cnt*D)}); d[i].x=max({-inf, d[2*i].x, d[2*i+1].x-d[2*i].cnt*D}); d[i].y=max({-inf, d[2*i].y, d[2*i+1].y+d[2*i].cnt*D}); d[i].cnt=d[2*i].cnt+d[2*i+1].cnt; } void build(int l, int r, int i) { if (l==r) return d[i]=node(-inf, -inf, -inf, 0), void(); int md=(l+r)/2; build(l, md, 2*i); build(md+1, r, 2*i+1); merge(l, r, i); } void update(int l, int r, int i, int idx, int x) { if (idx<l||r<idx) return; if (l==r) return d[i]=node(0, x-D, D-x, 1), void(); int md=(l+r)/2; update(l, md, 2*i, idx, x); update(md+1, r, 2*i+1, idx, x); merge(l, r, i); //cout<<"upd "<<d[i].ans<<' '<<d[i].cnt<<' '<<d[i].x<<' '<<d[i].y<<'\n'; } } s; int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n>>m>>D; for (int i=1; i<=n; i++) cin>>a[i], srt.push_back({a[i], i}); for (int i=1; i<=m; i++) cin>>b[i], srt.push_back({b[i], i+n}); sort(srt.begin(), srt.end()); s.build(1, n+m ,1); for (int i=1; i<=n; i++) { auto idx=lower_bound(srt.begin(), srt.end(), make_pair(a[i], i))-srt.begin()+1; //cout<<"idx "<<idx<<'\n'; s.update(1, n+m, 1, idx, a[i]); } //cout<<"ans "<<s.d[1].ans<<'\n'; for (int i=1; i<=m; i++) { auto idx=lower_bound(srt.begin(), srt.end(), make_pair(b[i], (int)(i+n)))-srt.begin()+1; s.update(1, n+m, 1, idx, b[i]); cout<<s.d[1].ans/2; if (s.d[1].ans%2) 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...