Submission #382636

#TimeUsernameProblemLanguageResultExecution timeMemory
382636jainbot27Snowball (JOI21_ho_t2)C++17
100 / 100
132 ms19524 KiB

#include <bits/stdc++.h>
using namespace std;

using ll = long long;

#define F0R(i, n) for(int i=0; i<n; i++)
#define FOR(i, a, b) for(int i=a; i<b; i++)
#define ROF(i, a, b) for(int i=b-1; i>=a; i--)
#define siz(x) (int) x.size()
#define f first 
#define s second

const int mxN = 2e5+10;
const ll infLL = 1e18+10;

int n, q;
ll x[mxN];
ll w[mxN];
ll ans[mxN];
ll dl[mxN], dr[mxN];
pair<ll, int> sl[mxN], sr[mxN];

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> q;
    F0R(i, n) cin >> x[i];
    F0R(i, q) cin >> w[i];
    // we will first solve for prefixs and then suffixs
    ll mn = 0, mx = 0;
    ll pos = 0;
    //F0R(i, q){
    //    pos += w[i];
    //    mn = min(mn, pos);
    //    mx = max(mx, pos);
    //}
    // find min and max
    //F0R(i, n) ans[i] += mn+mx;
    // init 
    dl[0] = infLL;
    FOR(i, 1, n) dl[i] = x[i]-x[i-1];
    dr[n-1] = infLL;
    F0R(i, n-1) dr[i] = x[i+1]-x[i];
    F0R(i, n) sl[i] = {dl[i], i}, sr[i] = {dr[i], i};
    sort(sl, sl+n); sort(sr, sr+n);
    //mn = 0, mx = 0, pos = 0;
    int pl = 0, pr = 0;
    F0R(i, q){
        pos += w[i];
        while(pl<n&&sl[pl].f<=mx-pos){
            ans[sl[pl].s] += max(-mn, sl[pl].f-mx);
            pl++;
        }
        while(pr<n&&sr[pr].f<=pos-mn){
            ans[sr[pr].s] += max(mx, sr[pr].f+mn);
            pr++;
        }
        mn = min(mn, pos);
        mx = max(mx, pos);
    }
    while(pl<n){
        ans[sl[pl].s] += -mn;
        pl++;
    }
    while(pr<n){
        ans[sr[pr].s] += mx;
        pr++;
    }
    F0R(i, n){
        cout << ans[i] << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...