제출 #636278

#제출 시각아이디문제언어결과실행 시간메모리
636278PiokemonSnowball (JOI21_ho_t2)C++17
100 / 100
115 ms16880 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long int
constexpr ll oo = 4611686018427387904;
ll naj_lewo[200009];
ll naj_prawo[200009];
ll ter[200009];
ll wiatr[200009];
ll poz[200009];
ll odp[200009];

int bin_ser(int pocz, int kon, ll szuk){
    int srod;
    while(pocz<kon){
        srod = (pocz+kon+1)/2;
        if (naj_prawo[srod]-naj_lewo[srod] > szuk){
            kon = srod-1;
        }
        else{
            pocz = srod;
        }
    }
    return pocz;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,q,dokl;
    ll dyst;
    cin >> n >> q;
    for (int x=1;x<=n;x++){
        cin >> poz[x];
    }
    ter[0] = 0;
    for (int x=1;x<=q;x++){
        cin >> wiatr[x];
        ter[x] = ter[x-1] + wiatr[x];
        naj_lewo[x] = min(naj_lewo[x-1],ter[x]);
        naj_prawo[x] = max(naj_prawo[x-1],ter[x]);
    }
    for (int x=1;x<n;x++){
        dyst = poz[x+1]-poz[x];
        dokl = bin_ser(0,q,dyst);
        odp[x] += naj_prawo[dokl];
        odp[x+1] += -naj_lewo[dokl];
        if (dokl < q){
            if (wiatr[dokl+1]>0){
                odp[x] += dyst-naj_prawo[dokl]+naj_lewo[dokl];
            }
            else{
                odp[x+1] += dyst-naj_prawo[dokl]+naj_lewo[dokl];
            }
        }
    }
    odp[1] += -naj_lewo[q];
    odp[n] += naj_prawo[q];
    for (int x=1;x<=n;x++){
        cout << odp[x] << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...