Submission #1228459

#TimeUsernameProblemLanguageResultExecution timeMemory
1228459spetrMeasures (CEOI22_measures)C++20
0 / 100
677 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()){
        tree[2*i+1][3] += tree[i][5];
        tree[2*i+1][4] += tree[i][5];
        tree[2*i+1][5] += tree[i][5];
        tree[2*i+2][3] += tree[i][5];
        tree[2*i+2][4] += tree[i][5];
        tree[2*i+2][5] += tree[i][5];
        tree[i][5] = 0;
    }
}

ll secti(ll l, ll r, ll L, ll R, ll i){
    if (l > r) return 0;
    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> positions;
    ll i = idx;
    while (i != 0){ positions.push_back(i); i = (i-1)/2; }
    positions.push_back(0);
    for (int j = positions.size()-1; j >= 0; --j){
        ll p = positions[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];

    // coordinate compression
    set<ll> s(nums.begin(), nums.end());
    map<ll,ll> mp;
    ll idx = 0;
    for (ll x : s) mp[x] = idx++;

    vl count(s.size(),0), index(s.size(),0);
    for (ll x : nums) count[mp[x]]++;
    for (size_t i = 1; i < count.size(); i++) index[i] = index[i-1] + count[i-1];

    // build sorted array of original values
    vl sorted = nums;
    sort(sorted.begin(), sorted.end());

    // size of segment-tree leaves
    ll size_leaves = 1;
    while (size_leaves < n+m) size_leaves <<= 1;

    // allocate full tree
    tree.assign(2*size_leaves - 1, {inf, inf, 0, inf, -inf, 0});
    // fill leaves
    for (ll i = 0; i < n+m; i++){
        tree[size_leaves - 1 + i] = {sorted[i], sorted[i], 0, inf, -inf, 0};
    }
    // build parents
    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];
        // count, min, max, lazy remain defaults
    }

    // process each person
    for (ll i = 0; i < n+m; i++){
        ll pos = index[mp[nums[i]]]++;
        ll cnt = secti(0, pos-1, 0, size_leaves-1, 0);
        update(size_leaves - 1 + pos, nums[i] - cnt*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...