제출 #638232

#제출 시각아이디문제언어결과실행 시간메모리
638232bonkJust Long Neckties (JOI20_ho_t1)C++14
100 / 100
168 ms14200 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5;
int ans[N + 2];
vector<pair<int, int>>a, b;

struct Segtree{
    int tree[4*N + 2];

    void update(int l, int r, int i, int pos, int val){
        if(l == r){
            tree[i] = val;
            return;
        }

        int mid = (l + r)/2;
        if(pos <= mid) update(l, mid, 2*i, pos, val);
        else update(mid + 1, r, 2*i + 1, pos, val);

        tree[i] = max(tree[2*i], tree[2*i + 1]);
    }

    int query(int l, int r, int i, int left, int right){
        if(l > right || r < left || l > r) return 0;
        if(left <= l && r <= right) return tree[i];
        
        int mid = (l + r)/2;
        return max(
            query(l, mid, 2*i, left, right),
            query(mid + 1, r, 2*i + 1, left, right)
        );
    }
} l, r;

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n; cin >> n;
    a.resize(n + 2); b.resize(n + 1);
    for(int i = 1; i <= n + 1; i++){
        cin >> a[i].first;
        a[i].second = i;
    }

    for(int i = 1; i <= n; i++){
        cin >> b[i].first;
        b[i].second = i;
    }

    sort(a.begin() + 1, a.end());
    sort(b.begin() + 1, b.end());

    for(int i = 1; i <= n; i++){
        l.update(1, n, 1, i, max(a[i].first - b[i].first, 0));
    }

    for(int i = 1; i <= n; i++){
        r.update(1, n, 1, i, max(a[i + 1].first - b[i].first, 0));
    }

    for(int i = 1; i <= n + 1; i++){
        ans[a[i].second] = max(l.query(1, n, 1, 1, i - 1), r.query(1, n, 1, i, n));
    }

    for(int i = 1; i <= n + 1; i++) cout << ans[i] << " ";
    cout << '\n';

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...