Submission #1228476

#TimeUsernameProblemLanguageResultExecution timeMemory
1228476spetrMeasures (CEOI22_measures)C++20
0 / 100
465 ms74228 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll inf = 1e18;
using vl = vector<ll>;
using vll = vector<vl>;

vll tree;

void push(ll i) {
    if (2*i+2 < (ll)tree.size()) {
        ll lazy = tree[i][5];
        for (int ch : {1,2}) {
            ll cidx = 2*i + ch;
            tree[cidx][3] += lazy;
            tree[cidx][4] += lazy;
            tree[cidx][5] += lazy;
        }
        tree[i][5] = 0;
    }
}

ll secti(ll l, ll r, ll L, ll R, ll i) {
    if (l > r) return 0;                // ošetření prázdného intervalu
    push(i);
    if (r < L || l > R) return 0;
    if (l <= L && R <= r) return tree[i][2];
    ll mid = (L+R)/2;
    return secti(l, r, L, mid, 2*i+1)
         + secti(l, r, mid+1, R, 2*i+2);
}

void update(ll idx, ll c) {
    vector<ll> st;
    ll i = idx;
    while (i) {
        st.push_back(i);
        i = (i-1)/2;
    }
    st.push_back(0);
    for (int j = (int)st.size()-1; j >= 0; --j) {
        ll p = st[j];
        push(p);
        tree[p][2]++;
        tree[p][3] = min(tree[p][3], c);
        tree[p][4] = max(tree[p][4], c);
    }
}

void pricti(ll l, ll r, ll L, ll R, ll c, ll i) {
    push(i);
    if (r < L || l > R) return;
    if (l <= L && R <= r) {
        tree[i][3] += c;
        tree[i][4] += c;
        tree[i][5] += c;
        return;
    }
    ll mid = (L+R)/2;
    pricti(l, r, L, mid, c, 2*i+1);
    pricti(l, r, mid+1, R, c, 2*i+2);
}

ll najdi_minimum(ll l, ll r, ll L, ll R, ll i) {
    push(i);
    if (r < L || l > R) return inf;
    if (l <= L && R <= r) return tree[i][3];
    ll mid = (L+R)/2;
    return min(najdi_minimum(l, r, L, mid, 2*i+1),
               najdi_minimum(l, r, mid+1, R, 2*i+2));
}

ll najdi_maximum(ll l, ll r, ll L, ll R, ll i) {
    push(i);
    if (r < L || l > R) return -inf;
    if (l <= L && R <= r) return tree[i][4];
    ll mid = (L+R)/2;
    return max(najdi_maximum(l, r, L, mid, 2*i+1),
               najdi_maximum(l, r, mid+1, R, 2*i+2));
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    ll n, m, d;
    cin >> n >> m >> d;
    vl nums(n+m);
    for (ll i = 0; i < n+m; i++) cin >> nums[i];

    // komprese souřadnic
    set<ll> s(nums.begin(), nums.end());
    map<ll,ll> mp;
    ll k = 0;
    for (ll x : s) mp[x] = k++;

    vl cnt(k), idx(k);
    for (ll x : nums) cnt[mp[x]]++;
    for (int i = 1; i < k; i++) idx[i] = idx[i-1] + cnt[i-1];

    vl sorted = nums;
    sort(sorted.begin(), sorted.end());

    ll size_leaves = 1;
    while (size_leaves < n+m) size_leaves <<= 1;

    // správné budování stromu
    tree.assign(2*size_leaves - 1, {inf,inf,0,inf,-inf,0});
    for (ll i = 0; i < n+m; i++)
        tree[size_leaves-1 + i] = {sorted[i], sorted[i], 0, inf, -inf, 0};
    for (ll i = size_leaves-2; i >= 0; --i) {
        tree[i][0] = tree[2*i+1][0];
        tree[i][1] = tree[2*i+2][1];
    }

    for (ll i = 0; i < n+m; i++) {
        ll pos = idx[mp[nums[i]]]++;
        ll cnt_less = secti(0, pos-1, 0, size_leaves-1, 0);
        update(size_leaves-1 + pos, nums[i] - cnt_less*d);
        pricti(pos+1, size_leaves-1, 0, size_leaves-1, -d, 0);
        ll mn = najdi_minimum(pos, size_leaves-1, 0, size_leaves-1, 0);
        ll mx = najdi_maximum(0, pos, 0, size_leaves-1, 0);
        if (i >= n) {
            double delta = mx - mn;
            cout << (delta * 0.5) << " ";
        }
    }

    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...