Submission #903979

#TimeUsernameProblemLanguageResultExecution timeMemory
903979HakiersMeasures (CEOI22_measures)C++17
100 / 100
285 ms39588 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; struct node{ ll pref, suf, inf, sum; }; constexpr int BASE = 1<<18; constexpr ll oo = 1e16; node TREE[BASE<<1]; pair<ll, int> Queries[BASE]; int who[BASE]; vector<pair<ll, int>> event; set<int> S; ll n, m, D; void update(int v, ll val){ v+=BASE; TREE[v].pref = TREE[v].suf = TREE[v].inf = TREE[v].sum = val; v/=2; while(v>0){ int l = 2*v, r = 2*v+1; TREE[v].pref = max(TREE[l].pref, TREE[l].sum+TREE[r].pref); TREE[v].suf = max(TREE[r].suf, TREE[l].suf+TREE[r].sum); TREE[v].sum = TREE[l].sum + TREE[r].sum; TREE[v].inf = max({TREE[l].inf, TREE[r].inf, TREE[l].suf+TREE[r].pref}); v/=2; } } void compute(){ sort(event.begin(), event.end()); int pos = 0; for(auto [a, i] : event){ Queries[i] = {a, ++pos}; who[pos] = i; } who[BASE-1] = BASE-1; Queries[BASE-1] = {oo, BASE-1}; S.insert((BASE-1)); } void add(pair<ll, int> x){ auto it = S.lower_bound(x.second); update(x.second, x.first - Queries[who[*it]].first + D); if(it != S.begin()){ it--; update(Queries[who[*it]].second, Queries[who[*it]].first - x.first + D); } S.insert(x.second); } void quer(){ ll out = 0; out = max({TREE[1].pref, TREE[1].suf, TREE[1].inf, TREE[1].sum}); cout << (out/2); if(out&1) cout << ".5"; cout << " "; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> D; for(int i = 1; i <= n+m; i++){ ll a; cin >> a; event.push_back({a, i}); } compute(); for(int i = 1; i <= n; i++) add(Queries[i]); for(int i = n+1; i <= n+m; i++){ add(Queries[i]); quer(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...