Submission #1369598

#TimeUsernameProblemLanguageResultExecution timeMemory
1369598aleksandreA Difficult(y) Choice (BOI21_books)C++20
100 / 100
1 ms420 KiB
#include <bits/stdc++.h>
#include "books.h"
using namespace std;
long long val[100005];
long long query(int x) {
    if (val[x] == 0) return val[x] = skim(x);
    return val[x];
}
void solve(int N, int K, long long A, int S) {
    long long sum = 0;
    for (int i = 1; i <= K; i++) sum += query(i);
    if (sum > 2 * A) {
        impossible();
        return;
    }
    if (sum >= A) {
        vector<int> v;
        for (int i = 1; i <= K; i++) v.push_back(i);
        answer(v);
        return;
    }
    int l = 1, r = N, m = N + 1;
    while (l <= r) {
        int mid = l + (r-l) / 2;
        if (query(mid) >= A) {
            m = mid;
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    if (m <= N) {
        long long ssum = sum - query(K) + query(m);
        if (ssum >= A && ssum <= 2 * A) {
            vector<int> v;
            for (int i = 1; i < K; i++) v.push_back(i);
            v.push_back(m);
            answer(v);
            return;
        }
    }
    int lim = min(m - 1, N);
    vector<int> v;
    for (int i = 1; i <= K; i++) v.push_back(i);
    for (int i = 0; i < K; i++) {
        sum -= query(K - i);
        sum += query(lim - i);
        v[K-1-i] = lim - i;
        if (sum >= A && sum <= 2 * A) {
            sort(v.begin(), v.end());
            answer(v);
            return;
        }
        if (sum > 2 * A) break;
    }
    impossible();
}
#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...