Submission #681641

#TimeUsernameProblemLanguageResultExecution timeMemory
681641YENGOYANA Difficult(y) Choice (BOI21_books)C++17
65 / 100
2 ms1104 KiB
#include <bits/stdc++.h>

#include "books.h"

using namespace std;
using ll = long long;
//
// --- 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) {
    vector<ll> vec(n);
    ll sm = 0;
    for (int i = 0; i < k - 1; ++i) {
        vec[i] = skim(i + 1);
        sm += vec[i];
    }
    int l = k - 2, r = n - 1;
    bool f = 0;
    while (l + 1 < r) {
        int m = (l + r) / 2;
        ll b = vec[m];
        if (!b) b = skim(m + 1);
        vec[m] = b;
        if (b > a) r = m, f = 1;
        else l = m;
    }
    if (r == n - 1 || (sm + vec[r + 1] < a || sm + vec[r + 1] > 2 * a)) {
        vector<int> ids;
        for (int i = 0; i < k; ++i) {
            if (!vec[i]) vec[i] = skim(i + 1);
            ids.push_back(i);
        }
        for (int i = max(r - k + 1, k); i <= r; ++i) {
            if (!vec[i]) vec[i] = skim(i + 1);
            ids.push_back(i);
        }
        for (int i = 0; i + k - 1 < ids.size(); ++i) {
            sm = 0;
            for (int j = i; j < i + k; ++j) {
                sm += vec[ids[j]];
            }
            if (sm >= a && sm <= 2 * a) {
                vector<int> ans;
                for (int j = i; j < i + k; ++j) {
                    //sm += vec[ids[j]];
                    ans.push_back(ids[j] + 1);
                }
                answer(ans);
                return;
            }
        }
        sm = 0;
        for (int i = 0; i < k - 1; ++i) sm += vec[i];
        l = k - 2, r = n - 1;
        while (l + 1 < r) {
            int m = (l + r) / 2;
            long long b = vec[m];
            if (!b) b = skim(m + 1);
            vec[m] = b;
            if (sm + b >= a) r = m;
            else l = m;
        }
        if (sm + vec[r] < a || sm + vec[r] > 2 * a) impossible();
        else {
            vector<int> ans;
            for (int i = 1; i <= k - 1; ++i) ans.push_back(i);
            ans.push_back(r + 1);
            answer(ans);
        }
        return;
    }
    vector<int> ans;
    for (int i = 1; i < k; ++i) ans.push_back(i);
    ans.push_back(r + 2);
    answer(ans);
}

Compilation message (stderr)

books.cpp: In function 'void solve(int, int, long long int, int)':
books.cpp:44:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |         for (int i = 0; i + k - 1 < ids.size(); ++i) {
      |                         ~~~~~~~~~~^~~~~~~~~~~~
books.cpp:25:10: warning: variable 'f' set but not used [-Wunused-but-set-variable]
   25 |     bool f = 0;
      |          ^
#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...