제출 #1334867

#제출 시각아이디문제언어결과실행 시간메모리
1334867AndreyMeasures (CEOI22_measures)C++20
100 / 100
637 ms207220 KiB
#include<bits/stdc++.h>
using namespace std;

long long d,sm = LLONG_MAX;
set<long long> idk;

struct node {
    int nl = -1;
    int nr = -1;
    long long ans = 0;
    long long pr = 0;
    long long su = 0;
    long long sb = 0;
    int br = 0;
    int pos = 0;
};

vector<node> seg(1);

node combine(node a, node b) {
    node c;
    c.nl = a.pos;
    c.nr = b.pos;
    c.pr = max(a.pr,a.sb+b.pr);
    c.su = max(b.su,b.sb+a.su);
    c.sb = a.sb+b.sb;
    c.ans = max(a.su+b.pr,max(a.ans,b.ans));
    return c;
}

void upd(long long l, long long r, long long x, long long p, long long c) {
    if(l == r) {
        if(c == 0) {
            seg[x].br++;
            seg[x].sb+=d;
        }
        else {
            seg[x].sb = seg[x].br*d+d-c;
        }
        long long b = seg[x].br;
        seg[x].pr = max(b*d,seg[x].sb);
        seg[x].su = max(0LL,seg[x].sb);
        seg[x].ans = seg[x].pr;
        return;
    }
    long long mid = (l+r)/2;
    if(p <= mid) {
        if(seg[x].nl == -1) {
            node y;
            y.pos = seg.size();
            seg[x].nl = seg.size();
            seg.push_back(y);
        }
        upd(l,mid,seg[x].nl,p,c);
    }
    else {
        if(seg[x].nr == -1) {
            node y;
            y.pos = seg.size();
            seg[x].nr = seg.size();
            seg.push_back(y);
        }
        upd(mid+1,r,seg[x].nr,p,c);
    }
    if(seg[x].nl == -1) {
        seg[x].ans = seg[seg[x].nr].ans;
        seg[x].sb = seg[seg[x].nr].sb;
        seg[x].pr = seg[seg[x].nr].pr;
        seg[x].su = seg[seg[x].nr].su;
    }
    else if(seg[x].nr == -1) {
        seg[x].ans = seg[seg[x].nl].ans;
        seg[x].sb = seg[seg[x].nl].sb;
        seg[x].pr = seg[seg[x].nl].pr;
        seg[x].su = seg[seg[x].nl].su;
    }
    else {
        seg[x] = combine(seg[seg[x].nl],seg[seg[x].nr]);
    }
    seg[x].pos = x;
}

void ins(long long a) {
    auto y = idk.lower_bound(a);
    if(y != idk.end()) {
        upd(0,1e9,0,a,(*y)-a);
    }
    if(a < sm) {
        sm = a;
    }
    else {
        auto y = *(--idk.upper_bound(a));

        if(y < a) {
            upd(0,1e9,0,y,a-y);
        }
    }
    idk.insert(a);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    long long n,m,a;
    cin >> n >> m >> d;
    for(long long i = 0; i < n; i++) {
        cin >> a;
        ins(a);
    }
    for(long long i = 0; i < m; i++) {
        cin >> a;
        ins(a);
        cout << seg[0].ans/2;
        if(seg[0].ans%2) {
            cout << ".5";
        }
        cout << " ";
    }
    cout << endl;
    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...