제출 #1303022

#제출 시각아이디문제언어결과실행 시간메모리
1303022yuichiro17A Difficult(y) Choice (BOI21_books)C++20
100 / 100
2 ms1168 KiB
#include <bits/stdc++.h>
#include "books.h"
using namespace std;
using ll = long long;

vector<ll>memo;
int n,k,s;
ll a;
ll ask(int i){
    if(memo[i]==-1)return memo[i]=skim(i+1);
    else return memo[i];
}
int bs(ll x,int l,int r){
    if(l==r)return l;
    int m=(l+r)/2;
    ll y=ask(m);
    if(x==y)return m;
    else if(x<y)return bs(x,l,m);
    else return bs(x,m+1,r);
}

void solve(int N, int K, long long A, int S) {
    n=N,k=K,a=A,s=S;
    memo=vector<ll>(n,-1);
    int x=bs(a,0,n-1);
    vector<pair<ll,int>>v;
    for(int i=0;i<10;i++){
        v.push_back({ask(i),i+1});
    }
    for(int i=max(10,x-10);i<=x;i++){
        v.push_back({ask(i),i+1});
    }
    {
        ll sum=ask(max(k-1,x));
        vector<int>ans={max(k-1,x)+1};
        for(int i=0;i<k-1;i++){
            ans.push_back(v[i].second);
            sum+=v[i].first;
        }
        if(sum>=a&&sum<=2*a){
            answer(ans);
            return;
        }
    }
    for(int i=0;i+k<=v.size();i++){
        ll sum=0;
        vector<int>ans;
        for(int j=i;j<i+k;j++){
            ans.push_back(v[j].second);
            sum+=v[j].first;
        }
        if(sum>=a&&sum<=2*a){
            answer(ans);
            return;
        }
    }
    impossible();
}
#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...