Submission #465033

#TimeUsernameProblemLanguageResultExecution timeMemory
465033DeepessonSnowball (JOI21_ho_t2)C++17
100 / 100
315 ms14016 KiB
#include <bits/stdc++.h>
///Bola de neve
#define MAX 2000005
long long valores[MAX][2];
bool dir[MAX];
int main()
{
    int N,Q;
    std::cin>>N>>Q;
    long long array[N];for(auto&x:array)std::cin>>x;
    for(auto&x:array) x += 1LL<<30LL;
    long long left=0,right=0,pos=0;
    for(int i=0;i!=Q;++i){
        long long D;
        std::cin>>D;
        pos+=D;
        if(pos<0){
            long long val = pos;
            if(val<0)val*=-1;
            left=std::max(left,val);
            dir[i]=true;
        }else {
            long long val = pos;
            if(val<0)val*=-1;
            right=std::max(right,val);
        }
        valores[i][0]=left;
        valores[i][1]=right;
    }
    long long resultados[N]={};
    resultados[0]+=left;
    resultados[N-1]+=right;
    for(int i=1;i!=N;++i){
        ///i-1 eh esquerda, se referindo a direita
        ///i eh a direita, e ira para a esquerda
        /// i-1 -> Direita     Esquerda <- i
        long long obj = array[i]-array[i-1];
        if(valores[Q-1][0]+valores[Q-1][1]>obj){
            int l=0,r=Q-1;
            while(l<r){
                int m = (l+r)/2;
                long long val = valores[m][0]+valores[m][1];
                if(val>=obj){
                    r=m;
                }else l=m+1;
            }

            long long a = valores[l][0]; ///Esquerda
            long long b = valores[l][1]; ///Direita
            if(a+b==obj){
                resultados[i-1]+=b;
                resultados[i]+=a;
            }else {
                long long dif = (a+b)-(obj);
                if(dir[l]){///Para a esquerda
                    a-=dif;
                }else {///Para a direita
                    b-=dif;
                }
                resultados[i-1]+=b;
                resultados[i]+=a;
            }

        }else {
            resultados[i-1]+=right;
            resultados[i]+=left;
        }
    }
    for(auto&x:resultados)std::cout<<x<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...