Submission #643674

#TimeUsernameProblemLanguageResultExecution timeMemory
643674RichemSnowball (JOI21_ho_t2)C++14
100 / 100
578 ms15316 KiB
#include <iostream>
#include <vector>
#define int long long
using namespace std;

const int MAX_NOMBRE = 2e5+42, INF = 1e13;

int nbBoule, nbVent;

int pos[MAX_NOMBRE];
int vent[MAX_NOMBRE][2] = {0};

int rep[MAX_NOMBRE][2] = {0};

void input() {
    cin >> nbBoule >> nbVent;

    for(int i = 0; i < nbBoule; i++)
        cin >> pos[i];

    int cumul = 0;
    for(int i = 0; i < nbVent; i++) {
        int curVent;
        cin >> curVent;

        cumul += curVent;

        if(i > 0) {
            vent[i][0] = min(vent[i-1][0], cumul);
            vent[i][1] = max(vent[i-1][1], cumul);
        }
        else {
            if(cumul < 0) vent[i][0] = cumul;
            else vent[i][1] = cumul;
        }
    }

    rep[0][0] = -vent[nbVent-1][0];
    rep[nbBoule-1][1] = vent[nbVent-1][1];
}


bool possible(int idBoule, int curEtape, int cote) {
    if((cote == 0 && idBoule == 0) || (cote == 1 && idBoule == nbBoule-1)) 
        return 1;

    //cout << curEtape << " COTE \n";

    //if(idBoule == 1 && curEtape == 0 && cote == 1) cout << " YIOUPU";

    int bordCur = pos[idBoule] + vent[curEtape][cote];
    int diff[2] = {-1, 1};

    int idAutre = idBoule + diff[cote];

    int bordAutre = pos[idAutre] + vent[curEtape][1 - cote];

    if(cote == 0) {
        rep[idBoule][cote] = max(rep[idBoule][cote], pos[idBoule] - max(bordCur, bordAutre));
    }
    else {
        rep[idBoule][cote] = max(rep[idBoule][cote], min(bordCur, bordAutre) - pos[idBoule]);
        //cout << rep[idBoule][cote] << " REP \n";
    }

    //cout << pos[idBoule] << " " << bordCur << " " << pos[idBoule + diff[cote]] << " " << bordAutre << endl;

    bool ok = ((max(bordAutre, pos[idAutre]) <= min(pos[idBoule], bordCur)) || (max(bordCur, pos[idBoule]) <= min(pos[idAutre], bordAutre)));

    return ok;
}

void dicho(int idBoule, int cote) {
    int deb = 0, fin = nbVent-1;

    int ah = 0;

    while(deb <= fin) {
        int milieu = (deb + fin+1) / 2;

        if(possible(idBoule, milieu, cote)) 
            deb = milieu;
        else
            fin = milieu-1;

        if(deb == fin) {
            ah++;
            if(ah > 1) return;
        }
    }
}

signed main() {
    input();

    /*
    dicho(1, 1);
    return 0;
    while(1) {
        int a,b,c;
        cin >> a >> b >> c;

        cout << possible(a,b,c) << endl;
    }
    */


    for(int cur = 0; cur < nbBoule; cur++) {
        dicho(cur, 0);
        dicho(cur, 1);

        cout << rep[cur][0] + rep[cur][1] << endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...