Submission #1368532

#TimeUsernameProblemLanguageResultExecution timeMemory
1368532kahoulA Difficult(y) Choice (BOI21_books)C++20
45 / 100
0 ms420 KiB
#include <bits/stdc++.h>

#include "books.h"
#define int long long

using namespace std;
//
// --- Sample implementation for the task books ---
//
// To compile this program with the sample grader, place:
//     books.h books.cpp grader.cpp
// in a single folder and run:
//     g++ books.cpp grader.cpp
// in this folder.
//

map<int, int> vals;

int get (int i) {
    return vals[i] = (vals.count(i) ? vals[i] : skim(i + 1));
}

void solve(signed n, signed k, long long A, signed s) {
    int sum = 0;
    for (int i = 0; i < k; i++) {
        sum += get(i);
    }
    int max_sum = 0;
    for (int i = n - 1; i >= n - k; i--) {
        max_sum += get(i);
    }

    if (sum > 2 * A || max_sum < A) {
        impossible();
        return;
    }

    int l = k - 1;
    int r = n - 1;

    while (true) {
        sum -= get(l);
        sum += get(r);
        if (sum >= A) break;
        l--;
        r--;
    }

    int a = l, b = r;
    sum -= get(r);

    while (a < b) {
        int m = (a + b) / 2;
        int cur = sum + get(m);

        if (cur >= A) b = m;
        else a = m + 1;
    }
    
    sum += get(a);
    assert((A <= sum && sum <= 2 * A));

    vector<signed> ans;
    for (int i = 0; i < l; i++) {
        ans.push_back(i + 1);
    }
    for (int i = r + 1; i < n; i++) {
        ans.push_back(i + 1);
    }
    ans.push_back(a + 1);
    answer(ans);
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...