Submission #1039551

#TimeUsernameProblemLanguageResultExecution timeMemory
1039551pccMeasures (CEOI22_measures)C++17
100 / 100
343 ms50628 KiB
#include <bits/stdc++.h> #include <bits/extc++.h> using namespace __gnu_pbds; using namespace std; #define ll long long template<typename T> using ordered_set = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>; const ll inf = 2e14; const ll mxn = 3e5+10; struct node{ ll mx,mn,tag; node(){ mx = -inf,mn = inf<<1,tag = 0; } }; struct SEG{ #define ls now*2+1 #define rs now*2+2 #define mid ((l+r)>>1) node seg[mxn*4]; node pull(node tl,node tr){ node re; re.mx = max(tl.mx+tl.tag,tr.mx+tr.tag); re.mn = min(tl.mn+tl.tag,tr.mn+tr.tag); return re; } void push(int now,int l,int r){ seg[ls].tag += seg[now].tag; seg[rs].tag += seg[now].tag; seg[now].tag = 0; seg[now] = pull(seg[ls],seg[rs]); return; } void modify(int now,int l,int r,int s,int e,ll v){ if(l>=s&&e>=r){ seg[now].tag += v; return; } push(now,l,r); if(mid>=s)modify(ls,l,mid,s,e,v); if(mid<e)modify(rs,mid+1,r,s,e,v); seg[now] = pull(seg[ls],seg[rs]); return; } void setval(int now,int l,int r,int p,ll v){ if(l == r){ seg[now].mx = seg[now].mn = v; seg[now].tag = 0; return; } push(now,l,r); if(mid>=p)setval(ls,l,mid,p,v); else setval(rs,mid+1,r,p,v); seg[now] = pull(seg[ls],seg[rs]); } ll getmx(int now,int l,int r,int s,int e){ if(l>=s&&e>=r){ return seg[now].mx+seg[now].tag; } push(now,l,r); if(mid>=e)return getmx(ls,l,mid,s,e); else if(mid<s)return getmx(rs,mid+1,r,s,e); else return max(getmx(ls,l,mid,s,e),getmx(rs,mid+1,r,s,e)); } ll getmn(int now,int l,int r,int s,int e){ if(l>=s&&e>=r){ return seg[now].mn+seg[now].tag; } push(now,l,r); if(mid>=e)return getmn(ls,l,mid,s,e); else if(mid<s)return getmn(rs,mid+1,r,s,e); else return min(getmn(ls,l,mid,s,e),getmn(rs,mid+1,r,s,e)); } SEG(){} #undef ls #undef rs #undef mid }; SEG seg; ordered_set<int> st; vector<ll> all; int ids[mxn]; ll N,M,D; ll ans; ll arr[mxn]; ll req[mxn]; ll bis(ll x,ll y){ ll l = ans,r = 3e15; while(l != r){ ll mid = (l+r)>>1; if(x<=y+mid*2)r = mid; else l = mid+1; } return l; } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); memset(ids,-1,sizeof(ids)); cin>>N>>M>>D; D<<=1; for(int i = 0;i<N+M;i++){ cin>>arr[i]; arr[i]<<=1; all.push_back(arr[i]); } { sort(all.begin(),all.end()); for(int i = 0;i<N+M;i++){ auto pos = lower_bound(all.begin(),all.end(),arr[i])-all.begin(); if(ids[pos] == -1)arr[i] = ids[pos] = pos; else arr[i] = ids[pos]; ids[pos]++; } } for(int i = 0;i<N+M;i++){ int pos = arr[i]; seg.modify(0,0,N+M,pos,N+M,-D); ll sh = st.order_of_key(pos); seg.setval(0,0,N+M,pos,all[pos]-D*sh); ll x = seg.getmx(0,0,N+M,0,pos); ll y = seg.getmn(0,0,N+M,pos,N+M); ans = bis(x,y); req[i] = ans; st.insert(pos); } for(int i = N;i<N+M;i++)cout<<(req[i]>>1)<<(req[i]&1?".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...