Submission #946090

#TimeUsernameProblemLanguageResultExecution timeMemory
946090PikachuA Difficult(y) Choice (BOI21_books)C++17
100 / 100
1 ms1428 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> a(n + 2, -1);
    long long sum = 0;
    for (int i = 1; i <= k; i++) {
        a[i] = skim(i);
        sum += a[i];
    }
    if (sum > 2ll * A) impossible();
    if (sum >= A) {
        vector<int> ans;
        for (int i = 1; i <= k; i++) ans.push_back(i);
        answer(ans);
    }
    int l = 1, r = n, oe = n + 1;
    while (l <= r) {
        int mid = (l + r) >> 1;
        a[mid] = skim(mid);
        if (a[mid] >= A) {
            oe = mid;
            r = mid - 1;
        }
        else l = mid + 1;
    }
    if (oe != n + 1) {
        if (sum - a[k] + a[oe] <= 2ll * A) {
            vector<int> ans;
            for (int i = 1; i < k; i++) {
                ans.push_back(i);
            }
            ans.push_back(oe);
            answer(ans);
        }
    }
    oe--;
    long long dak = 0;
    for (int i = oe; i > oe - k; i--) {
        a[i] = skim(i);
        dak += a[i];
    }
    if (dak < A) impossible();
    for (int i = oe; i > oe - k; i--) {
        vector<int> ans;
        int lef = k - (oe - i + 1);
        long long sum = 0;
        for (int j = 1; j <= lef; j++) {
            ans.push_back(j);
            sum += a[j];
        }
        for (int j = i; j <= oe; j++) {
            ans.push_back(j);
            sum += a[j];
        }
        if (A <= sum && sum <= 2ll * A) {
            answer(ans);
        }
    }
    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...