제출 #1204113

#제출 시각아이디문제언어결과실행 시간메모리
1204113UnforgettableplA Difficult(y) Choice (BOI21_books)C++20
60 / 100
1 ms1196 KiB
#include <bits/stdc++.h>
#include "books.h"
using namespace std;

void solve(int N,int K,long long A,int S){
    vector<long long> 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;
        }
    }
    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...