제출 #1327405

#제출 시각아이디문제언어결과실행 시간메모리
1327405SSKMFSnowball (JOI21_ho_t2)C++20
100 / 100
70 ms8324 KiB
#include <bits/stdc++.h>
using namespace std;

int64_t locatie[200001] , prefix[200001][2] , rezultat[200001];

int main ()
{
    ios :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int cantitate , numar_operatii;
    cin >> cantitate >> numar_operatii;

    for (int indice = 1 ; indice <= cantitate ; indice++)
        { cin >> locatie[indice]; }
    
    int lungime = 0;
    int64_t minim = 0 , maxim = 0 , suma = 0;
    while (numar_operatii--)
    {
        int64_t termen;
        cin >> termen;

        if (suma + termen < minim) {
            lungime++;
            prefix[lungime][0] = prefix[lungime - 1][0];
            prefix[lungime][1] = prefix[lungime - 1][1] + minim - (suma + termen);
            minim = suma + termen;
        }
        if (suma + termen > maxim) {
            lungime++;
            prefix[lungime][0] = prefix[lungime - 1][0] + (suma + termen) - maxim;
            prefix[lungime][1] = prefix[lungime - 1][1];
            maxim = suma + termen;
        }

        suma += termen;
    }

    rezultat[1] = prefix[lungime][1];
    rezultat[cantitate] = prefix[lungime][0];
    for (int indice = 1 ; indice < cantitate ; indice++)
    {
        const int64_t limita = locatie[indice + 1] - locatie[indice];

        int stanga = 1 , dreapta = lungime;
        while (stanga <= dreapta)
        {
            const int mijloc = (stanga + dreapta) >> 1;
            if (prefix[mijloc][0] + prefix[mijloc][1] <= limita) { stanga = mijloc + 1; }
            else { dreapta = mijloc - 1; }
        }

        rezultat[indice] += prefix[dreapta][0];
        rezultat[indice + 1] += prefix[dreapta][1]; 
        if (dreapta < lungime) {
            if (prefix[dreapta + 1][0] != prefix[dreapta][0])
                { rezultat[indice] += limita - (prefix[dreapta][0] + prefix[dreapta][1]); }
            else
                { rezultat[indice + 1] += limita - (prefix[dreapta][0] + prefix[dreapta][1]); }
        }
    }

    for (int indice = 1 ; indice <= cantitate ; indice++)
        { cout << rezultat[indice] << '\n'; }

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