Submission #1204093

#TimeUsernameProblemLanguageResultExecution timeMemory
1204093UnforgettableplA Difficult(y) Choice (BOI21_books)C++20
0 / 100
1 ms804 KiB
#include <bits/stdc++.h>
#include "books.h"
using namespace std;

void solve(int N,int K,long long A,int S){
    vector<int> memo(N+1);
    auto optSkim = [&](int x){
        if(memo[x]==0)return memo[x]=skim(x);
        else return memo[x];
    };
    auto test = [&](int x,bool strict){
        long long sum = 0;
        if(optSkim(x)>=A){
            for(int i=1;i<K;i++)sum+=optSkim(i);
            sum+=optSkim(x);
        } else {
            for(int i=x-K+1;i<=x;i++)sum+=optSkim(i);
        }
        if(strict)return A<=sum and sum<=2ll*A;
        return A<=sum;
    };
    int ans = K-1;
    for(int jump=(1<<16);jump;jump/=2){
        if(ans+jump>N)continue;
        if(!test(ans+jump,false))ans+=jump;
    }
    ans++;
    int ans2 = K-1;
    for(int jump=(1<<16);jump;jump/=2){
        if(ans2+jump>N)continue;
        if(optSkim(ans2+jump)<A)ans2+=jump;
    }
    ans2++;
    // if(ans==N+1 or !test(ans,true)){
    //     swap(ans2,ans);
    //     if(ans==N+1 or !test(ans,true)){
    //         impossible();
    //         return;
    //     }
    // }
    ans = -1;
    for(int i=K;i<=N;i++)if(test(i,true)){ans=i;break;}
    if(ans==-1)impossible();
    vector<int> anss;
    if(optSkim(ans)>=A){
        for(int i=1;i<K;i++)anss.emplace_back(i);
        anss.emplace_back(ans);
    } else {
        for(int i=ans-K+1;i<=ans;i++)anss.emplace_back(i);
    }
    answer(anss);
}
#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...