# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
943091 | teacup | A Difficult(y) Choice (BOI21_books) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "books.h"
using namespace std;
#define ll long long
#define ii pair<int,int>
#define vi vector<int>
typedef vector<ii> vii;
//
// --- Sample implementation for the task books ---
//
// To compile this program with the sample grader, place:
// books.h books_sample.cpp sample_grader.cpp
// in a single folder and run:
// g++ books_sample.cpp sample_grader.cpp
// in this folder.
//
void solve(int N, int K, long long A, int S) {
// TODO implement this function
vector<long long> V(N+5);
vector<int> ans;
memset(V, -1, sizeof(V));
long long sum=0;
for (int i=1; i<=K; i++){
V[i]=skim(i);
sum+=V[i];
ans.push_back(V[i]);
}
if (sum>2*A){
impossible();
}else if (sum>=A){
//answer!!
answer(ans);
}else{
//sum<A
ans.clear();
//binary search from K+1 to N
ll L=1, R=N-K+1, M;
while (L<R) {
M = (L+R)/2;
sum = 0;
for (ll i=0; i<K; i++){
if (V[M+i]==-1) V[M+i] = skim(M+i);
sum += V[M+i];
}
if (sum < A) L = M+1;
else R = M;
}
sum = 0;
for (ll i=0; i<K; i++){
if (V[L+i]==-1) V[L+i] = skim(L+i);
sum += V[L+i];
ans.push_back(L+i);
}
if(sum>=A && sum<=2*A){
answer(ans);
}else{
impossible();
}
}
}