제출 #595494

#제출 시각아이디문제언어결과실행 시간메모리
595494DeepessonUplifting Excursion (BOI22_vault)C++17
5 / 100
5038 ms5248 KiB
#include <bits/stdc++.h>
#define MAX 1000005
int maximo[MAX];
int bonus = MAX/2;
typedef std::pair<int,int> pii;
int main()
{
    long long N,M;
    std::cin>>N>>M;
    if(abs(M)>bonus){
        std::cout<<"impossible\n";
        return 0;
    }
    for(auto&x:maximo)x=-(1e6);
    maximo[bonus]=0;
    for(int i=-N;i<=N;++i){
        int c;
        std::cin>>c;
        if(!c)continue;
        int valor=abs(i);
        if(!valor){
            for(auto&x:maximo)x+=c;
            continue;
        }
        std::priority_queue<pii> vals[valor];
        ///Da direita para a esquerda
        if(i>0){
            for(int j=0;j!=MAX-1;++j){
                if(j-i<0)continue;
                int mod = j%valor;
                int kok = j/valor;
                int v = -1;
                while(vals[mod].size()){
                    if(kok-vals[mod].top().second>c){
                        vals[mod].pop();
                        continue;
                    }
                    v=vals[mod].top().first+kok;
                    break;
                }
                vals[mod].push({maximo[j]-kok,kok});
                maximo[j]=std::max(maximo[j],v);
            }
        }else if(i<0){
            for(int j=MAX-1;j!=-1;--j){
                if(j-i<0)continue;
                int mod = j%valor;
                int kok = j/valor;
                int v = -1;
                while(vals[mod].size()){
                    if(abs(kok-vals[mod].top().second)>c){
                        vals[mod].pop();
                        continue;
                    }
                    v=vals[mod].top().first-kok;
                    break;
                }
                vals[mod].push({maximo[j]+kok,kok});
                maximo[j]=std::max(maximo[j],v);
            }
        }
    }
    ///como proceder caso x=0?
    if(maximo[M+bonus]<=0){
        std::cout<<"impossible\n";
        return 0;
    }
    std::cout<<maximo[M+bonus]<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...