제출 #1091754

#제출 시각아이디문제언어결과실행 시간메모리
1091754vjudge1Measures (CEOI22_measures)C++14
100 / 100
282 ms22492 KiB
#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) cerr << __LINE__ << ": " << #x << " = " << x << endl
#define _ << " _ " <<

template<class> struct is_container : false_type {};
template<class... Ts> struct is_container<vector<Ts...>> : true_type {};
template<class... Ts> struct is_container<map<Ts...>> : true_type {};
template<class... Ts> struct is_container<unordered_map<Ts...>> : true_type {};
template<class... Ts> struct is_container<set<Ts...>> : true_type {};
template<class... Ts> struct is_container<unordered_set<Ts...>> : true_type {};
template<class... Ts> struct is_container<multiset<Ts...>> : true_type {};
template<class... Ts> struct is_container<unordered_multiset<Ts...>> : true_type {};
template<class T, class = typename enable_if<is_container<T>::value>::type>
ostream& operator<<(ostream &o, T x) {
  int f = 1;
  o << "{";
  for (auto y : x) {
    o << (f ? "" : ", ") << y;
    f = 0;
  }
  return o << "}";
}
template<class T, class U>
ostream& operator<<(ostream &o, pair<T, U> x) {
  return o << "(" << x.first << ", " << x.second << ")";
}

#define fi first
#define se second

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;

const int OFF = 1 << 18;
const ll INF = 1e18;

struct SegTree {
    ll mini[2 * OFF], maxi[2 * OFF], lazy[2 * OFF];

    SegTree() {
        for (int i = 1; i < 2 * OFF; i++) {
            mini[i] = INF;
            maxi[i] = -INF;
        }
    }

    void propagate(int i) {
        mini[2 * i + 0] += lazy[i];
        maxi[2 * i + 0] += lazy[i];
        lazy[2 * i + 0] += lazy[i];
        mini[2 * i + 1] += lazy[i];
        maxi[2 * i + 1] += lazy[i];
        lazy[2 * i + 1] += lazy[i];
        lazy[i] = 0;
    }

    void update(int i) {
        mini[i] = min(mini[2 * i], mini[2 * i + 1]);
        maxi[i] = max(maxi[2 * i], maxi[2 * i + 1]);
    }

    void set(int pos, ll val, int i = 1, int lo = 0, int hi = OFF) {
        if (lo + 1 == hi) {
            mini[i] += val - INF;
            maxi[i] += val + INF;
        } else {
            propagate(i);
            int mid = (lo + hi) / 2;
            if (pos < mid) set(pos, val, 2 * i + 0, lo, mid);
            else set(pos, val, 2 * i + 1, mid, hi);
            update(i);
        }
    }

    void add(int l, int r, ll val, int i = 1, int lo = 0, int hi = OFF) {
        if (l <= lo && hi <= r) {
            mini[i] += val;
            maxi[i] += val;
            lazy[i] += val;
        } else if (r <= lo || hi <= l) return;
        else {
            propagate(i);
            int mid = (lo + hi) / 2;
            add(l, r, val, 2 * i + 0, lo, mid);
            add(l, r, val, 2 * i + 1, mid, hi);
            update(i);
        }
    }

    pll query(int l, int r, int i = 1, int lo = 0, int hi = OFF) {
        if (l <= lo && hi <= r) return {mini[i], maxi[i]};
        else if (r <= lo || hi <= l) return {INF, -INF};
        else {
            propagate(i);
            int mid = (lo + hi) / 2;
            auto p = query(l, r, 2 * i + 0, lo, mid);
            auto q = query(l, r, 2 * i + 1, mid, hi);
            return {min(p.fi, q.fi), max(p.se, q.se)};
        }
    }
} T;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n, m;
    ll d;
    cin >> n >> m >> d;
    vll x(n + m);
    vector<pll> vec(n + m);
    for (int i = 0; i < n + m; i++) {
        cin >> x[i];
        vec[i] = {x[i], i};
    }
    sort(vec.begin(), vec.end());
    vi idx(n + m);
    for (int i = 0; i < n + m; i++) idx[vec[i].se] = i;

    ll sol = 0;
    for (int i = 0; i < n + m; i++) {
        T.set(idx[i], -x[i]);
        T.add(idx[i], OFF, d);

        sol = max(sol, T.query(idx[i], OFF).se - T.query(0, idx[i]).fi);
        sol = max(sol, T.query(idx[i] + 1, OFF).se - T.query(0, idx[i] + 1).fi);

        if (i >= n) cout << sol / 2 << ((sol & 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...